Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在数组中输入带有空格的名称或地址_C_Arrays - Fatal编程技术网

C 在数组中输入带有空格的名称或地址

C 在数组中输入带有空格的名称或地址,c,arrays,C,Arrays,可能重复: 我是C新手,我觉得这应该很简单,但由于某些原因,我没有看到明确的答案 试图将名称和地址写入文件,但如果我输入“FirstName LastName”,则只会在文件中输入FirstName。地址也一样。有没有一种方法可以接受文件中带有空格的全名 struct person{ char name[20]; char address[50]; char telno[20]; } info; fp=fopen("contacts","a") printf

可能重复:

我是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新手,请原谅我的无知。谢谢。

在发现空白时停止转换参数。试试。

在发现空白时停止转换参数。试试看

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

是的,使用
fgets()
(通常建议使用此函数而不是
scanf()
,因为
scanf()
并不总是像您认为的那样:

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

是的,使用
fgets()
(通常建议使用此函数而不是
scanf()
,因为
scanf()
并不总是像您认为的那样:

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

// This will read into comment everything up until the newline
scanf(" %[^\n]",info.name); 
通常,您将得到的答案是“不使用scanf”,而是使用
fgets()

fgets(info.name, sizeof info.name, stdin);
不要忘记和的许多信息,其他信息通过快速搜索很容易获得


编辑:
我尝试用fgets替换scanf,但当我运行程序时,它跳过了“输入名称:”

如果您的
fgets()
正在“跳过”,则意味着您的
fgets()
只是读取了位于
stdin
缓冲区上的剩余字符。我敢打赌这是一个新线人物

输入字符串时:

john smith
您将在
'h'
后面的末尾追加一个新行
'\n'
。这意味着,
scanf()
将读取字母并离开换行符,而另一方面,
fgets()
将读取直到/包括换行符的所有内容。因此,如果你要这样做:

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

fgets(info.address, sizeof info.address, stdin);
fgets()
将显示为“跳过”。如果你说用
fgets()
替换两者是跳过第一个,那么你的
stdin
缓冲区是不干净的,你必须先有一些东西,然后才能在上面留下换行符。

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

// This will read into comment everything up until the newline
scanf(" %[^\n]",info.name); 
通常,您将得到的答案是“不使用scanf”,而是使用
fgets()

fgets(info.name, sizeof info.name, stdin);
不要忘记和的许多信息,其他信息通过快速搜索很容易获得


编辑:
我尝试用fgets替换scanf,但当我运行程序时,它跳过了“输入名称:”

如果您的
fgets()
正在“跳过”,则意味着您的
fgets()
只是读取了位于
stdin
缓冲区上的剩余字符。我敢打赌这是一个新线人物

输入字符串时:

john smith
您将在
'h'
后面的末尾追加一个新行
'\n'
。这意味着,
scanf()
将读取字母并离开换行符,而另一方面,
fgets()
将读取直到/包括换行符的所有内容。因此,如果你要这样做:

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

fgets(info.address, sizeof info.address, stdin);
fgets()
将显示为“跳过”。如果你说用
fgets()
替换两者会跳过第一个,那么你的
stdin
缓冲区不干净,你必须有一些东西才能在上面留下换行符。

scanf(“%[^\r\n]”,info.name)

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

scanf(“%[^\r\n]”,info.name)


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

关于将空格与scanf一起使用的主题->不要使用普通的
scanf(“%s”,…)
。请改用
scanf(“%19s”,…)
或类似的方法。有关将空格与scanf一起使用的主题->不要使用普通
scanf(“%s”,…)
。改用
scanf(“%19s”,…)
或类似的东西。我尝试用
fgets(info.name,sizeof info.name,stdin)替换scanf但是当我运行程序时,它跳过了“输入名称:”部分,直接进入“输入地址:”(输入名称:输入地址:)@fixafone123-那么你就不会显示整个代码了。注意:如果在
fgets
之前的循环或
scanf
getchar
中执行此操作,那么您只需读取一个换行符(看起来像是在跳过“回车”),如果要继续使用scanf,您可以尝试在使用scanf后使用fflush(stdin)刷新缓冲区。@AdmiralJonB-否。
fflush(stdin)
是未定义的行为。不应该这样做,也不应该建议这样做。@Mike,就是这样。我有一个通过scanf获取输入的选择菜单,所以我的fgets从中读取换行符。谢谢!我尝试用
fgets(info.name,sizeof info.name,stdin)替换scanf;
但当我运行程序时,它跳过“输入名称:”部分,直接进入“输入地址”(“输入名称:输入地址:”)@fixafone123-那么你不会显示整个代码。注意:如果你在
fgets
之前的循环或
scanf
getchar
中执行此操作,那么你只需读取一个换行符(看起来像是跳过了“回车”),你可以尝试使用fflush(stdin)如果要继续使用scanf,请在使用scanf后刷新缓冲区。@adminaljonb-No.
fflush(stdin)
是未定义的行为。不应该这样做,也不应该建议这样做。@Mike,就是这样。我有一个通过scanf获取输入的选择菜单,所以我的FGET正在从中读取换行符。谢谢!