跳过 getchar 和 scanf 的麻烦
skipped trouble with getchar and scanf
我最近开始用 C 编程,但我遇到了这段代码的问题:
#include <stdio.h>
#include <stdlib.h>
#define PI 3.1416
int main () {
float x;
int y;
x = PI;
printf("Enter y: ");
scanf(" %i", &y);
printf("The new value of y is: %i.\n\n",y);
x = x * y;
printf("The new value of x is: %f.\n\n",x);
getchar();
return 0;
}
问题出现在最后的getchar()
,程序关闭,不等待输入。我找到了一个我根本不喜欢的解决方案,就是添加 2 次 getchar()
。有什么办法吗?我正在使用 ubuntu 所以 system("pause")
不是一个选项
scanf
命令不会消耗您在输入 y
后按下的回车键。所以 getchar()
愉快地消费了它。
一种解决方案是在读取后消耗输入行的其余部分y
;代码如下:
int ch; while ( (ch = getchar()) != '\n' && ch != EOF ) {}
虽然在程序结束时还有其他暂停选项,但这可能是个好主意,因为如果您稍后扩展程序以期望输入字符串或字符,这将是必要的。
这个问题的一个很好的通用解决方案是使用 fgets
读取用户的输入,然后使用 sscanf
:
扫描它
char ln[1024];
printf("Enter y: ");
fgets(ln, 1024, stdin);
sscanf(ln, "%d", &y);
您仍然需要检查 fgets
和 sscanf
的 return 值以了解错误情况,但以这种方式处理面向行的输入更容易。
我最近开始用 C 编程,但我遇到了这段代码的问题:
#include <stdio.h>
#include <stdlib.h>
#define PI 3.1416
int main () {
float x;
int y;
x = PI;
printf("Enter y: ");
scanf(" %i", &y);
printf("The new value of y is: %i.\n\n",y);
x = x * y;
printf("The new value of x is: %f.\n\n",x);
getchar();
return 0;
}
问题出现在最后的getchar()
,程序关闭,不等待输入。我找到了一个我根本不喜欢的解决方案,就是添加 2 次 getchar()
。有什么办法吗?我正在使用 ubuntu 所以 system("pause")
不是一个选项
scanf
命令不会消耗您在输入 y
后按下的回车键。所以 getchar()
愉快地消费了它。
一种解决方案是在读取后消耗输入行的其余部分y
;代码如下:
int ch; while ( (ch = getchar()) != '\n' && ch != EOF ) {}
虽然在程序结束时还有其他暂停选项,但这可能是个好主意,因为如果您稍后扩展程序以期望输入字符串或字符,这将是必要的。
这个问题的一个很好的通用解决方案是使用 fgets
读取用户的输入,然后使用 sscanf
:
char ln[1024];
printf("Enter y: ");
fgets(ln, 1024, stdin);
sscanf(ln, "%d", &y);
您仍然需要检查 fgets
和 sscanf
的 return 值以了解错误情况,但以这种方式处理面向行的输入更容易。