1

可能重复:
如何允许使用 scanf 输入空格?
如何使用 scanf() 扫描带有空格的字符串?

C 新手,我觉得这应该很简单,但由于某种原因,我没有看到明确的答案。

尝试将名称和地址写入文件,但如果我输入“FirstName LastName”,则只会将 FirstName 输入文件。与地址相同。有没有办法接受整个名称和文件中的空格?

struct person{
     char name[20];
     char address[50];
     char telno[20];
} info;

fp=fopen("contacts","a")

printf("Enter Name : ");
scanf("%s",info.name);

printf("Enter Address : ");
scanf("%s",info.address);

fprintf(fp,"%20s %20s %20s",info.name,info.address,info.telno);
fclose(fp);

C新手,请原谅我的无知。谢谢。

4

4 回答 4

4

将“空白”读入字符串的唯一方法scanf()是使用否定扫描集:

// This will read into comment everything up until the newline
scanf(" %[^\n]",info.name); 

通常,您将得到的答案是“不使用 scanf”,fgets()而是使用:

fgets(info.name, sizeof info.name, stdin);

不要忘记很多有关scanf()fgets()的信息,其他信息很容易通过快速搜索获得。


编辑: I tried replacing scanf with fgets but when I run the program it skips past the "Enter Name:"

如果它被您“跳过” fgets(),则意味着您fgets()刚刚读取了位于stdin缓冲区中的剩余字符。我敢打赌这是一个换行符。

输入字符串时:

john smith

您将'\n''h'. 这意味着scanf()将阅读字母并离开换行符,fgets()另一方面将阅读所有内容直到/包括换行符。因此,如果您要这样做:

scanf("%s",info.name);

fgets(info.address, sizeof info.address, stdin);

fgets()似乎被“跳过” 。如果您说将两者都替换fgets()为跳过第一个,那么您的stdin缓冲区不干净,您必须先准备一些东西,然后在上面留下换行符。

于 2012-12-19T16:16:58.227 回答
3

scanf(3)找到空格时停止转换参数。试试fgets(3)

于 2012-12-19T16:15:43.333 回答
2

有没有办法用空格接受全名

fgets()的,使用(通常建议使用此函数而不是scanf(),因为scanf()它并不总是按照您的想法执行):

fgets(info.name, sizeof(info.name), stdin);
于 2012-12-19T16:16:48.880 回答
0

scanf("%[^\r\n]",info.name);

这意味着接受除 CR 和 LF 之外的所有内容。

于 2012-12-19T16:22:29.013 回答