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

时间:2019-11-25 15:37:37

标签: c scanf buffer fgets

所以,我有这段代码,然后继续将“名称”保存到二进制文件中。

scanf("%d", &option);
while(getchar() != '\n');

fgets(name,MAX_SIZE,stdin);

我认为fgets保留了该'\ n',导致第一个单词保存在二进制文件的第2行中,然后每个单词都保存在新行中。但是,当我退出循环之前继续将其他内容保存到另一个二进制文件时,字符串将被连续保存。

如何摆脱“ \ n”?非常感谢。

1 个答案:

答案 0 :(得分:0)

请注意,读取换行符的正确循环也需要考虑EOF(输入的最后一行可能不以换行符结尾),因此应该为:

int c;
while ((c = getchar()) != EOF && c != '\n')
    ;

读取名称的代码可能应该是这样,再次记住可能没有任何输入,因此fgets()可能表示EOF:

char name[MAX_SIZE];
if (fgets(name, sizeof(name), stdin) != NULL)
{
    name[strcspn(name, "\n")] = '\0';
    …write name to binary file…
}

name开头不会有换行符;如果用户只是点击 return 而不是输入名称,则可能没有任何name,但是您可以很容易地检测到它。您可能还希望删除开头和结尾的空格,甚至可以规范行中的空格(确保将一个或多个空格字符的所有序列替换为单个空格)。

由于您尚未显示如何将数据写入“二进制文件”,因此尚不清楚任何人都可以为您提供更多帮助。如果添加了写数据的代码,您将得到一个更有用的答案。例如,如果您使用fprintf(fp, "\n%s\n", name),则会获得换行符,但您不太可能会问到这一点。