一、实现多行字符输入
当题目要求输入多行字符时,如:
exWE AW ER
SW XC BN
XM CW AZ
使用scanf的%c来格式输入的错误引例,在输入完两个字符串后输入'\n'来用以回车是无效的。其会把回车当作一个字符变量识别
int main()
{
char ch1, ch2;
for (int i=0;i<3;i++) {
scanf("%c %c\n", &ch1, &ch2);
printf("ch1=%c\n", ch1);
printf("ch2=%c\n", ch2);
}
}
为什么scanf会识别回车呢?之前发的一篇博客也提到过:
我们知道scanf输入的数据是先存放在“缓冲区”,可以把它理解为一个队列。输入数据从队列的右端进入,而scanf读取数据是从队列的左端取出。注意:与格式控制符不匹配的数据还停留在缓冲区中。
程序只有在输入一个无效的字符,回车后才能退出
当键盘录入 ‘ %c %c\n ’的时候,输入的前两个字符会被读取到并且赋值给变量,后面的回车会被scanf拿去 (看看这不就是我们要做的吗 )
但是问题就在于:此时缓冲区里是一片空白,然而程序结束需要读到缓冲区里任意一个回车才可以结束。
但是我不是输入了很多空格么? 这个是scanf读取有效字符的问题:比如,scanf要读取到有效的整型,会跳过开头的一切回车和空白,直到遇到整型才会纳入赋值给相应变量,然后再遇到回车才会结束这条语句。所以接着刚问题,缓冲区中是空白的时候,就是给一万个\n ,scanf语句会把它视为开头的空白,是不会读取的,所以要加入一点东西,跳过这个开头的空白,再给回车才有效果。所以它才会一直等待你输入一点东西。
把没用的回车给吸收了:使用getchar()就可以了(因为吸收了回车,所以没有必要在scanf中写\n)
int main()
{
char ch1, ch2;
for (int i=0;i<3;i++) {
scanf("%c %c",&ch1,&ch2);
char a=getchar();//吸收多余的回车字符
printf("ch1=%c\n", ch1);
printf("ch2=%c\n", ch2);
}
}
“利用scanf函数从键盘接收一字符(或整数)时,它只读入字符(或整数)本身,而把字符(或整数)后的回车符留在输入缓冲区内;
gets函数从标准的输入读取,如果使用gets函数给字符数组输入字符串时,字符数组不能指定长度,因为,只要字符数组的长度小于gets函数读取的行缓存的大小,即使你输入的字符数大于你所规定的字符数组的长度,gets函数也会接收所输入的全部字符,造成字符数组越界。因此,gets是一个不推荐使用的函数。
二、实现普通多行输入
这个博主讲的很详细,受益匪浅。
原文链接:
自己写的一点儿:
法一:while(scanf(“%d”,&n)) //当n有输入时
{if(n==0)
break;} //当输入为0,程序结束
★法二:while(~scanf(”%d”,&n)&&n!=0)
~是按位取反,用于检索是不是文件尾,scanf语句如果没有输入值就是返回-1,按位取反结果为0。
形同 while(scanf("%d",&n)!=EOF)和while(~scanf("%d",&n))
功能:当读到文件结尾时中止循环
//C语言实现多组输入的方法
int main()
{
int n = 0;
1. while(scanf("%d",&n) == 1) //scanf会返回成功读取的变量个数,例如只输入了一个变量就返回1
2. while(scanf("%d",&n) != EOF)
//EOF是在stdio.h里面定义的常量(通常值为-1),表示输入流已经结束。读取失败时返回EOF(-1)
3. while(~scanf("%d",&n)) //最常用的,
return 0;
}
在while里scanf()的返回值是正确输入的变量的个数,比如当你输入一个数,他返回的值就是1,while(scanf("%d",&n)!=0)就相当于while(1!=0)
补充:scanf返回值的三种情况:
- 正整数,表示正确输入参数的个数 如: scanf("%d %d", &i, &j);
如果用户输入"1 2",可以正确输入,返回2(正确输入了两个变量);
如果用户输入"1,1",可以正确输入i,无法输入j,返回1(正确输入了一个变量)。
若用户只输入0,表示用户输入不匹配,返回0
如输入前加了,如(,3,4),无法正确输入任何值,
- EOF,这是在stdio.h里面定义的常量(通常值为-1),表示输入流已经结束。