memset() 在 while(fgets) 之后

memset() after while(fgets)

我的程序应该从 stdin 读取并将输入移交给系统 - 以防输入不等于 "exit"。 除非第二个输入比第一个长,否则这非常有效。 例如,如果第一个输入是 "hello",第二个是 "hellohello",则输入将拆分为 "hello" 和 "ello"。 我想问题是循环时 buffer 没有被正确清除。因此我使用了 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 = '[=10=]';

    if (strcmp(s,"exit")==0){
         break;
    } else {
        system(s);
    }

    memset(s, 0, MAX);
}
free(s);
return 0;
}

这里不正确的是(sizeof(s)-1)。这不会 return 分配缓冲区的大小,而是 return (char*) 的大小。您的缓冲区大小是 MAXmemset() 确实对此没有任何作用,因此将其删除。如果您不需要这样做 -1fgets() 将始终自动在字符串末尾附加零终止符,即使缓冲区已满。 还有这两行

temp = s+(strlen(s)-1);
*temp = '[=10=]';

不需要,因为
fgets() 从流中读取最多一个小于 size 的字符,并将它们存储到 s 指向的缓冲区中。读取在 EOF 或换行符后停止。如果读取换行符, 它被存储到缓冲区中。一个终止空字节 (aq[=29=]aq) 存储在缓冲区中最后一个字符之后。"
(来自"man fgets",google为之)