memset()之后while(fgets)

时间:2018-10-30 11:03:47

标签: c pointers fgets memset

我的程序应该从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;
}

1 个答案:

答案 0 :(得分:3)

这里的错误内容是(sizeof(s)-1)。这不会返回分配的缓冲区的大小,而是返回(char*)的大小。您的缓冲区大小为MAXmemset()确实对此无能为力,因此请将其删除。您不需要这样做-1fgets()始终会自动在字符串末尾附加零终止符,即使缓冲区已满。 也是这两行

temp = s+(strlen(s)-1);
*temp = '\0';
不需要

,因为
fgets()从流中读取的字符数最多小于大小,并将它们存储到s所指向的缓冲区中。在EOF或换行符之后读取停止。如果读取了换行符,它存储在缓冲区中。终止空字节(aq \ 0aq)存储在缓冲区中的最后一个字符之后。“
(来自“ man fgets”,来自Google)