我有一个简单的程序,它接收来自3个不同函数的输入,2个返回整数,1个返回一个char,但是第三个函数由于某种原因没有scanf它完全跳过该步骤。
#include <stdio.h>
int get_height();
int get_length();
char get_symbol();
void draw_rectangle(int h, int l, char s);
int main () {
int h, l;
char s;
h = get_height();
l = get_length();
s = get_symbol();
draw_rectangle(h, l, s);
return 0;
}
int get_height() {
int i;
printf ("Please enter the height of the rectangle: ");
scanf ("%d", &i);
return i;
}
int get_length() {
int i;
printf ("Please enter the length of the rectangle: ");
scanf ("%d", &i);
return i;
}
char get_symbol() {
char i;
printf ("Please enter the symbol for the rectangle: ");
scanf ("%c", &i);
return i;
}
void draw_rectangle(int h, int l, char s) {
printf ("%d %d %c", h, l, s);
}
当我运行它时,我可以扫描高度和长度,但它会打印提示以扫描char,但随后会跳过用户输入并打印h和l但不是s的值。我在这里缺少什么?
答案 0 :(得分:3)
上一个scanf在输入缓冲区中留下一个换行符:
scanf ("%c", &i);
只需将其更改为:
scanf (" %c", &i);
注意空间。这将告诉scanf忽略所有空格。
答案 1 :(得分:2)
您需要使用之前scanf()
次调用留下的换行符。一个简单的方法是:
scanf ("%d", &i);
getchar();
在每个使用它的函数中。或只用一个电话:
scanf(" %c", &i);
空格将告诉它跳过之前的标签,换行符或空格。
stdin
被缓冲,当用户输入数字时,您也会获得换行符。因此,获取该角色的scanf将获取其中一条留在新线上的内容
答案 2 :(得分:0)
您也可以使用
fflush(stdin);
scanf("%c",&i);
它将解决您的问题。因为fflush在读取字符之前清除缓冲区