c - memset() 在 while(fgets) 之后
问题描述
我的程序应该从标准输入读取并将输入移交给系统 - 以防输入不等于“退出”。除非第二个输入比第一个长,否则效果很好。例如,如果第一个输入是“hello”,第二个输入是“hellohello”,则输入会分成“hello”和“ello”。我猜问题是缓冲区 s 在循环时没有正确清除。因此我使用memset()
了但不幸的是我没有得到我想要的结果。
任何人都可以看到错误吗?
非常感谢!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 1024
int main(){
char *s = (char *)malloc(MAX);
char *temp = NULL;
while(fgets(s, (sizeof(s)-1), stdin)!= NULL){
temp = s+(strlen(s)-1);
*temp = '\0';
if (strcmp(s,"exit")==0){
break;
} else {
system(s);
}
memset(s, 0, MAX);
}
free(s);
return 0;
}
解决方案
这里不正确的是(sizeof(s)-1)
. 这不会返回已分配缓冲区的大小,而是返回(char*)
. 你的缓冲区大小是MAX
。memset()
真的没有做任何事情,所以删除它。您不需要这样做,即使缓冲区已满,也将始终自动在字符串末尾附加零终止符-1
。fgets()
还有这两行
temp = s+(strlen(s)-1);
*temp = '\0';
不需要,因为
"fgets()
从流中最多读取一个小于 size 的字符并将它们存储到 指向的缓冲区中s
。读取在一个或换行符之后停止EOF
。如果读取换行符,则将其存储到缓冲区中。终止空字节 (aq\0aq) 存储在缓冲区中的最后一个字符之后。”
(来自“man fgets”,谷歌为它)
推荐阅读
- android-gradle-plugin - 使用 AGP 4.2.0 或 7.0 时未为 androidTests 生成 R 文件
- c# - 从 Base64 获取文件扩展名/mime 类型
- javascript - 将下拉列表中的第一个值设置为 VueJs 中的默认值
- r - R:有效地读取文件并加入它们
- jquery - checkmarx 客户端潜在的 XSS 修复
- swift - 如何将 JSON 数据保存到我的本地主机中?http post响应说“200”
- python - 在 Python 数据类中使用描述符作为字段的正确方法是什么?
- amazon-web-services - 如何在 Terraform 中使用 AWS Backup 在不同区域创建文件库?
- symfony - 作曲家安装/更新触发器类 Doctrine\Common\Cache\ArrayCache 不存在
- angular - 将`Encrypted`文件上传到Azure容器并在另一端`Decrypt` - 使用Angular