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正在从中读取换行符。谢谢!