根据这个post,在2D数组中存储文本最常用的方法是使用%s方法。但是,这种方法有一个缺点,即每当按空格键时,后面键入的文本将进入数组的第二个元素。例如,你键入
输入:-
char数组的第一个元素=大家好
输出:-
char数组的第一个元素=Hi
char数组的第二个元素=everyone
预期产量:-
char数组的第一个元素=大家好
所以,我想问一下为什么下面的书面方法不能用于将文本输入到二维数组中?
#include <stdio.h>
int main()
{
char ch[20];
printf("Enter name:");
scanf("%19[^\n]", ch);
printf("Your name is: %s", ch);
return 0;
}
如果上述方法可以使用,请告诉我如何使用?
请不要在回答这篇文章时介绍指针概念/代码。这是一个问题,以理解为什么上述书面方法失败。
将此视为失败的代码:-
#include <stdio.h>
int main()
{
char name[4][20];
int i;
printf("Enter names:-\n");
for(i=0; i<4; i++)
{
printf("Enter name %d: ", i);
scanf("%19[^\n]", name[i]);
printf("\n");
}
for(i=0; i<4; i++)
{
printf("Entered name %d: %s", i, name[i]);
printf("\n");
}
return 0;
}
上述程序编译时没有任何错误或警告,但在运行时失败。
最佳答案
您提供的示例中的问题是换行符留在缓冲区中。您可以通过更改以下内容来丢弃此前导空白:
scanf("%19[^\n]", &name[i]);
为了这个
scanf(" %19[^\n]", &name[i]);
注意
%19
之前的空格。有了这个,你的程序会打印:输入名称:-
输入名称0:foo
输入名称1:bar
输入名称2:baz
输入名称3:qux
输入名称0:foo
输入名称1:栏
输入名称2:baz
输入名称3:qux
这是因为
%[^\n]
说明符告诉它除了换行符以外的所有内容。因此,换行符将留在缓冲区中,当再次调用scanf
时,它是缓冲区中的第一件事,因此这些额外的调用不能接受任何输入。scanf
中的前导空格解决了这个问题,因为它告诉scanf
放弃任何后面的空白,包括缓冲区中剩余的换行符。这就是areference所说的:
空白字符:函数将读取并忽略在下一个非空白字符之前遇到的任何空白字符
字符(空白字符包括空格、换行符和制表符
字符—请参见isspace)。格式字符串中的单个空白
验证从
流(包括无)。
关于c - 2D char数组(将空格键存储在一个char数组元素中吗?),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54671314/