首页 > 解决方案 > 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;
}

标签: cpointersfgetsmemset

解决方案


这里不正确的是(sizeof(s)-1). 这不会返回已分配缓冲区的大小,而是返回(char*). 你的缓冲区大小是MAXmemset()真的没有做任何事情,所以删除它。您不需要这样做,即使缓冲区已满,也将始终自动在字符串末尾附加零终止符-1fgets()还有这两行

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

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


推荐阅读