fgets()函数在打印字符串时会自动换行

3
#include <stdio.h>

void main () {
    char str[5];
    fgets(str, sizeof(str), stdin);
    printf("%s.", str);
}

我用C语言编写了这段简单的代码,想要将字符串和一个句点同时打印在同一行上。但是当我输入长度为3或更少字符的字符串时,输出结果会在字符串后出现换行。

输入:

abc

输出:

abc
.

如果我输入的内容恰好为4个字符,输出结果会如我所愿,没有换行符。
我尝试使用gets()和scanf()函数,它们的效果很好,但我不能使用它们。
有人知道为什么会出现这种情况以及解决办法吗?

2
你有读过fgets的文档吗?如果有,再仔细读一遍。如果没有:请仔细阅读。 - too honest for this site
关于去除 fgets 在缓冲区中添加的换行符的建议。 - user3386109
如果我输入的内容恰好有4个字符,输出结果就是我想要的,并且 '\n' 等待被下一个 fgets() 调用读取。但是程序先结束了。 - chux - Reinstate Monica
2个回答

6
这个问题的解释可以在 fgets 的文档 中找到:
解析会在文件末尾或者遇到换行符时停止,此时 str 会包含那个换行符。
这正是发生在您的情况中的事情: str 包含输入字符串"abc"后面跟着的换行符 '\n',这个字符被打印在"abc" 和点号'.'之间。

0
问题在于 fgets() 会读取换行符 char。您需要将附加在您的 char 数组中的换行符去掉。

fgets(str, sizeof(str), stdin); 之后,您可以写下面这行代码来摆脱那个换行符

str[strlen(str)-1]='\0'; 或者您也可以这样做,

char * p=NULL;
p= strchr(str,'\n');
if(p!=NULL)
{
 *p='\0';
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接