同时使用scanf()函数和getchar()函数的陷阱

函数名: scanf 
功 能: 执行格式化输入 
用 法: int scanf(char *format[,argument,...]);

scanf()函数是通用终端格式化输入函数,它从标准输入设备(键盘) 读取输入的信息。

函数名:getchar

功能:从计算机终端(一般是键盘)输入一个字符。

  同时使用者两个函数时,会有陷阱,代码如下:

  1. #include <stdio.h>
  2. int main(void)
  3. {
  4. char buff[20],ch;
  5. int num,i=0;
  6. printf("请输入一个数字:\n");
  7. scanf("%d",&num);
  8. printf("请输入一个字符串:\n");
  9. while((ch=getchar())!=‘\n‘)
  10. {
  11. buff[i] = ch;
  12. i++;
  13. }
  14. buff[i] = ‘\0‘;
  15. }

  运行如上代码:

  发现并没有给我们输入字符串的机会,直接跳过了11行的while,这就是同时使用这两个函数的陷阱,因为前面的scanf()在读取输入时会在缓冲区中留下一个字符‘\n‘,所以如果不在此加一个
getchar()把这个回车符取走的话,getchar()就不会等待从键盘键入字符,而是会直接取走这个“无用的”回车符,从而导致读取有误,要解决这个问题,就要防止在使用getchar()之前还有‘\n‘;处理方法是使用while(getchar()!=‘\n‘); 清除之前的回车;代码如下:

  1. #include <stdio.h>
  2. int main(void)
  3. {
  4. char buff[20],ch;
  5. int num,i=0;
  6. printf("请输入一个数字:\n");
  7. scanf("%d",&num);
  8. printf("请输入一个字符串:\n");
  9. while(getchar()!=‘\n‘);
  10. while((ch=getchar())!=‘\n‘)
  11. {
  12. buff[i] = ch;
  13. i++;
  14. }
  15. buff[i] = ‘\0‘;
  16. }

  

问题完美解决。其实用 if((ch=getchar())==‘\n‘);  也是可以的,只要从缓冲区读出有‘\n‘,就什么也不做,不要忘了有分号;

原文地址:https://www.cnblogs.com/CQWF/p/9495309.html

时间: 2024-10-05 17:26:25

同时使用scanf()函数和getchar()函数的陷阱的相关文章

C语言编程之--scanf()函数与getchar()函数搭配来理解C程序的输入缓存(buffer)

博主最近在学习C语言编程,在书中的代码示例中出现了下面的代码段: #include<stdio.h> int main() { char a[5]; int i; printf("请依次输入值:\n"); for(i=0;i<5;i++) { scanf("%c",&a[i]); getchar(); //为什么要加一个getchar()? } printf("\n"); for(i=0;i<5;i++) { pr

getch()、getche()和getchar()函数

getch().getche()和getchar()函数(1) getch()和getche()函数  这两个函数都是从键盘上读入一个字符.其调用格式为:  getch();  getche();  两者的区别是:getch()函数不将读入的字符回显在显示屏幕上,而getche() 函数却将读入的字符回显到显示屏幕上.       例1:        #include"stdio.h"       #include"conio.h"       void main

c语言:用getchar函数读入两个字符给c1,c2,用putchar和printf输出。思考问题

用getchar函数读入两个字符给c1,c2,分别用putchar和printf输出这两个字符.思考以下问题: (1)变量c1和c2定义为字符型还是整型?或二者皆可? (2)要求输出c1和c2的ASCII码,应如何处理? (3)整形变量和字符变量是否在任何情况下都可以互相代替?char c1, c2;和int  c1, c2;是否无条件等价? 程序: #include<stdio.h> int main() { char c1, c2; printf("请输入两个字符c1,c2:&q

小议getchar()函数

函数原型: int scanf(constchar*format,...); 该函数定义在头文件stdio.h里,因此在使用scanf函数时要加上#include <stdio.h>.它是格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中. 函数 scanf() 是从标准输入流stdio (标准输入设备,一般是键盘)中读内容的通用子程序,可以说明的格式读入多个字符,并保存在对应地址的变量中. 其调用形式为: scanf("<格式说明字符串>",&

软件测试中LoadRunner函数中的几个陷阱

软件测试 中 LoadRunner 函数中的几个陷阱 1.atof 在 loadrunner 中如果直接用 float f; f=atof("123.00"); lr _output_message("%f",f); 输出的结果会是1244128.00,根本不是我们想要的. 因为float,double型在不同的平台下长度不一样,所以在loadrunner 软件测试中LoadRunner函数中的几个陷阱 1.atof 在loadrunner中如果直接用 float

关于getchar函数缓冲区的问题

最近,看到有同学问我关于getchar()这个函数缓冲区的问题,结合我以前的学习,我将对getchar()进行一次总结,当然,这些都是别人已经提过的东西,我只是总结,接下来我们来看看. 首先,用getchar()函数进行字符的输入,并不是直接从键盘这个硬件中读取输入的字符,而是从"输入缓冲区"中得到的字符.输入缓冲区是一个字符的队列,其中存储了所有你尚未读取的字符.每次调用getchar函数,它就会从输入缓冲区中读出第一个字符,并把这个字符从输入缓冲区中清除. 然而,这个输入缓冲区的设

Python函数参数默认值的陷阱和原理深究(转)

add by zhj: 在Python文档中清楚的说明了默认参数是怎么工作的,如下 "Default parameter values are evaluated when the function definition is executed. This means that the expression is evaluated once, when the function is defined, and that the same “pre-computed” value is used

C语言#getchar()函数

1.getchar()的作用 getchar()函数的作用是从缓冲区读入一个字符的数据,第一次读取数据getchar()会等待用户键入ENTER然后开始从缓冲区进行读取数据,如果缓冲区的数据大于1个字节,剩下的数据会暂时存储在缓冲区,getchar会依次进行读取,而不需要用户再次输入ENTER来触发读取. getchar()的返回值是一个整型的数据,其值对应字符的ASCII码. 2.统计输入空格数量的小程序 1 #include<stdio.h> 2 3 main() { 4 5 int n;

scanf函数与printf函数用法

一开始学习就是用的cin.cout,所有习惯用这个,但是后来做题发现这样的输入方式有弊端,所以决定整理熟悉一下scanf函数与printf函数. 头文件 # include <stdio.h> scanf("输入控制符",输入参数) 在 scanf 的“输入参数”中,变量前面的取地址符&不要忘记. scanf 中双引号内,除了“输入控制符”外什么都不要写. “输出控制符”和“输出参数”无论在“顺序上”还是在“个数上”一定要一一对应. “输入控制符”的类型和变量所定义