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*) 的大小。你的缓冲区大小是MAXmemset() 真的对此没有任何作用,所以删除它。你不需要这样做-1fgets() 将始终自动在字符串末尾附加零终止符,即使缓冲区已满。 还有这两行

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

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

【讨论】:

谢谢!这解决了我的问题!我正在寻找代码错误部分的错误。

以上是关于memset() 在 while(fgets) 之后的主要内容,如果未能解决你的问题,请参考以下文章

试图理解 fgets()

求教c语言中fgets的用法

使用 fgets 从文件中读取

linux popen卡在了fgets上

[即使使用了getchar,fgets似乎也可以“获取” n

PHP fgets 函数