如何使用scanf()扫描带有空格的字符串?

7

我想编写一个子程序,让用户输入他们的评论。我使用 scanf("%s", X) 来让他们输入评论,但是它只能将空格前的单词存储到字符串中。

如何解决这个问题,以便将整个句子存储到字符串或文件中?

下面是我的代码:

FILE *fp;
char comment[100];
fp=fopen("comment.txt","a");
printf("You can input your comment to our system or give opinion to the musics :\n");
scanf("%s",comment);
fputs(comment,fp);

如果你想添加空格,%s 不是你想要的,你需要使用否定的扫描集。 - Mike
2
注意:如果第一个字符是“\n”,则scanf(“%[^\n]”,comment)不会将任何内容扫描到comment中,导致comment未初始化。 - chux - Reinstate Monica
4个回答

22
与其告诉你不要使用scanf(),不如直接使用scanf()的Negated scanset选项:(参见此处)
scanf("%99[^\n]",comment); // This will read into the string: comment 
                           // everything from the next 99 characters up until 
                           // it gets a newline

4
在这种情况下,也许应该使用 "%99[^\n]"?顺便说一句,这会导致\n没有被读入且仍然在输入缓冲区中。如果要将其放入循环中,请尝试使用 " %99[^\n]"(前面有空格)。 - chux - Reinstate Monica

13

scanf()函数使用%s作为格式说明符,从第一个非空白字符开始读取一系列字符,直到(1)遇到另一个空白字符或者(2)达到指定的字段宽度(比如scanf("%127s",str); -- 读取127个字符并将null字节作为第128个字符附加在字符串末尾),以先到者为准。然后自动在末尾添加null字节。传递的指针应足够大,可以容纳输入序列中的所有字符。

您可以使用fgets函数读取整行:

fgets(comment, sizeof comment, stdin);

注意,fgets函数也会读取换行符。你可能希望从comment中去掉换行符。


3

使用fgets代替scanf在stdin上读取整行。


1
您可以使用gets()getline()函数从stdin读取字符串。

gets()自C99以来已被弃用并自C11中移除。为什么gets()函数如此危险,不应该使用? getline()是一个POSIX函数,在C中不存在。 - phuclv

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