memset() 在 while(fgets) 之后
Posted
技术标签:
【中文标题】memset() 在 while(fgets) 之后【英文标题】:memset() after while(fgets) 【发布时间】:2018-10-30 11:03:47 【问题描述】:我的程序应该从标准输入读取并将输入交给系统 - 以防输入不等于“退出”。
除非第二个输入比第一个长,否则效果很好。
例如,如果第一个输入是“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)
的值。你会发现这不是你所期望的。
谢谢!这有助于解决我的问题
system() 不关心尾随的换行符,因此无需剥离它。
【参考方案1】:
这里不正确的是(sizeof(s)-1)
。这不会返回已分配缓冲区的大小,而是返回 (char*)
的大小。你的缓冲区大小是MAX
。 memset()
真的对此没有任何作用,所以删除它。你不需要这样做-1
,fgets()
将始终自动在字符串末尾附加零终止符,即使缓冲区已满。
还有这两行
temp = s+(strlen(s)-1);
*temp = '\0';
不需要,因为
"fgets()
从流中最多读入一个小于 size 的字符并将它们存储到s
指向的缓冲区中。在EOF
或换行符之后停止读取。如果读取换行符,则将其存储到缓冲区。终止的空字节 (aq\0aq) 存储在缓冲区中的最后一个字符之后。”(来自“man fgets”,google 为它)
【讨论】:
谢谢!这解决了我的问题!我正在寻找代码错误部分的错误。以上是关于memset() 在 while(fgets) 之后的主要内容,如果未能解决你的问题,请参考以下文章