2

我有一个简单的程序,它接收来自 3 个不同函数的输入,2 个返回整数,1 个返回一个字符,但第三个函数由于某种原因不扫描,它完全跳过了该步骤。

#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);
}

当我运行它时,我可以扫描高度和长度,但它会打印提示以扫描字符,但随后会跳过用户输入并打印 h 和 l 的值,但不打印 s。我在这里想念什么?

4

3 回答 3

3

先前的 scanf 在输入缓冲区中留下一个换行符,由以下内容使用:

scanf ("%c", &i);

只需将其更改为:

scanf (" %c", &i);

注意空间。这将告诉 scanf 忽略所有空格。

于 2012-12-11T19:56:21.470 回答
2

scanf()您需要使用先前调用留下的换行符。一个简单的方法是:

scanf ("%d", &i);
getchar();

在使用它的每个函数中。或者只需一个电话:

scanf(" %c", &i); 

空格会告诉它跳过前面的制表符、换行符或空格。

stdin被缓冲,当用户输入一个数字时,你也会得到一个换行符。因此,带有该字符的 scanf 会选择剩下的换行符之一

于 2012-12-11T19:55:13.333 回答
0

你也可以使用

fflush(stdin);
scanf("%c",&i);

它将解决您的问题。由于 fflush 在读取字符之前清除缓冲区

于 2012-12-12T15:53:07.563 回答