C语言中连续多次scanf无法成功运行的问题简析
2012-09-06 14:26
357 查看
当有连续多个scanf()时,有时候能成功运行而有时候却无法读入数据。经过一段时间的调试,发现并无语法错误,则应该是C语言对此函数的一些历史遗留问题了。在向他人提问和网上搜索后,终于解决如次问题。原因如下:
scanf无法连用,主要是因为缓冲区不足,提交缓冲就好了。stdin 默认的缓冲区给了4k 加上一些系统的东西. 4k很快就不够用了。另一个原因是,第一scanf()接受一个字符输入,当你输入一个字符后按下回车,只有你输入的那个字符被赋给了a,而剩下的一个换行符还保留在缓冲中,当第二次输入时 无论你输入的什么字符,都是无效的,缓冲就如堆栈,符合先进先出原则,既然你缓冲中先前有个换行符,那么系统在遇见第二个scanf时自动会将换行符赋给 b,所以输入的东西都是无效的....所以 fflush 一下就可以解决此问题。最好在每个scanf前加上fflush( stdin );保证正常运行。
那么getch和getchar是否会产生这样的问题呢?答案是不会。具体过程尚未研究。同时,推荐大家以后在需要使用scanf时用scanf_s来代替,这也是为什么VS2010中,大家总会看到一条warning就是提示不要使用scanf而使用scanf_s的原因。
ex:
#include <stdio.h>
#include <stdlib.h>
int main ( void )
{
float a,b,c,d,e;
char dtm;
printf("What are the cooeficients of second order sections?\n");
scanf("%f %f", &a, &b);
c = -b;
d = a + a;
e = a * a - b * c;
printf("The coefficients are: %f %f \n",d,e);
printf("Do you want to continue calculating?(Y/N)");
fflush( stdin );
scanf("%c", &dtm);
if (dtm=='Y')
printf("The coefficients are: %c \n",dtm);
else
printf("NNNNNNNN\n");
return 0;
}
scanf无法连用,主要是因为缓冲区不足,提交缓冲就好了。stdin 默认的缓冲区给了4k 加上一些系统的东西. 4k很快就不够用了。另一个原因是,第一scanf()接受一个字符输入,当你输入一个字符后按下回车,只有你输入的那个字符被赋给了a,而剩下的一个换行符还保留在缓冲中,当第二次输入时 无论你输入的什么字符,都是无效的,缓冲就如堆栈,符合先进先出原则,既然你缓冲中先前有个换行符,那么系统在遇见第二个scanf时自动会将换行符赋给 b,所以输入的东西都是无效的....所以 fflush 一下就可以解决此问题。最好在每个scanf前加上fflush( stdin );保证正常运行。
那么getch和getchar是否会产生这样的问题呢?答案是不会。具体过程尚未研究。同时,推荐大家以后在需要使用scanf时用scanf_s来代替,这也是为什么VS2010中,大家总会看到一条warning就是提示不要使用scanf而使用scanf_s的原因。
ex:
#include <stdio.h>
#include <stdlib.h>
int main ( void )
{
float a,b,c,d,e;
char dtm;
printf("What are the cooeficients of second order sections?\n");
scanf("%f %f", &a, &b);
c = -b;
d = a + a;
e = a * a - b * c;
printf("The coefficients are: %f %f \n",d,e);
printf("Do you want to continue calculating?(Y/N)");
fflush( stdin );
scanf("%c", &dtm);
if (dtm=='Y')
printf("The coefficients are: %c \n",dtm);
else
printf("NNNNNNNN\n");
return 0;
}
相关文章推荐
- 关于C语言中连续多次scanf无法成功运行的问题简析
- 使用C语言中qsort()函数对浮点型数组无法成功排序的问题
- javac编译成功,用java运行class文件出现“找不到或无法加载主类” 的问题
- xcode 编译成功但是模拟器无法运行问题,product中run按钮为灰色问题
- 关于命令行中javac 编译成功,用 java 运行 class 文件出现 “ 找不到或无法加载主类 ” 的问题
- Scanf连续调用多次并且存在%c的问题
- C-Scanf连续调用多次并且存在%c的问题
- 在WIN10系统下运行VS2013编译成功后出现:无法启动程序“.exe” 系统找不到指定文件的问题的解决方法
- javac编译成功,用java运行class文件出现“找不到或无法加载主类” 的问题解决起来很简单
- C语言中用scanf连续输入两个字符类型的问题
- C语言中用scanf连续输入两个字符类型的问题
- javac编译成功,用java运行class文件出现“找不到或无法加载主类” 的问题
- Scanf连续调用多次并且存在%c的问题
- 运行VS2013编译成功后出现:无法启动程序“.exe” 系统找不到指定文件的问题的解决方法
- Scanf连续调用多次并且存在%c的问题
- Scanf连续调用多次并且存在%c的问题
- c语言中连续使用两个scanf的问题
- javac编译成功,用java运行class文件出现“找不到或无法加载主类” 的问题
- Scanf连续调用多次并且存在%c的问题
- Scanf连续调用多次并且存在%c的问题