我的程序应该从stdin读取并将输入移交给系统-如果输入不等于“ exit”。
除非第二个输入比第一个输入长,否则效果很好。
例如,如果第一个输入是“ 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;
}
答案 0 :(得分:3)
这里的错误内容是(sizeof(s)-1)
。这不会返回分配的缓冲区的大小,而是返回(char*)
的大小。您的缓冲区大小为MAX
。 memset()
确实对此无能为力,因此请将其删除。您不需要这样做-1
,fgets()
始终会自动在字符串末尾附加零终止符,即使缓冲区已满。
也是这两行
temp = s+(strlen(s)-1);
*temp = '\0';
不需要,因为
“ fgets()
从流中读取的字符数最多小于大小,并将它们存储到s
所指向的缓冲区中。在EOF
或换行符之后读取停止。如果读取了换行符,它存储在缓冲区中。终止空字节(aq \ 0aq)存储在缓冲区中的最后一个字符之后。“
(来自“ man fgets”,来自Google)