一、实现多行字符输入

当题目要求输入多行字符时,如:

exWEAW ERSW XC BNXM 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是一个不推荐使用的函数。

二、实现普通多行输入

这个博主讲的很详细,受益匪浅。

原文链接:https://blog.csdn.net/qq_44631587/article/details/121339227

自己写的一点儿:

法一: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),表示输入流已经结束。