【问题标题】:3rd function won't run scanf第三个函数不会运行 scanf
【发布时间】:2012-12-11 19:54:05
【问题描述】:

我有一个简单的程序,它接收来自 3 个不同函数的输入,2 个返回 int,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);
}

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

【问题讨论】:

  • 如果函数名不带参数,则将void写在方括号中。
  • @yzb3 '[' 和 ']' 是括号; '(' 和 ')' 被称为 圆括号
  • 吉姆,认真的:D? @H2CO3 C void arguments
  • @yzb3 是的,说真的(我知道为什么,但是 C 的解释方式很疯狂 [C++ 比 C 做得更好的罕见事情之一])。
  • @H2CO3 我的“认真”是针对 Jim Balter。

标签: c


【解决方案1】:

前一个 scanf 在输入缓冲区中留下一个换行符,供以下人员使用:

scanf ("%c", &i);

只需将其更改为:

scanf (" %c", &i);

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

【讨论】:

    【解决方案2】:

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

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

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

    scanf(" %c", &i); 
    

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

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

    【讨论】:

    • 模式“%d\n”难道不需要第二次函数调用就能完成同样的事情吗?
    • @PeterGluck - 不完全是。这将导致换行符作为输入被跳过,但 scanf 将继续等待(你点击&lt;digit&gt;&lt;enter&gt;,它仍然在等待输入),从用户的角度来看,它会奇怪地工作。 getchar() 将使用流中的换行符。另一个功能选项是在 %c 之前放置一个空格,这将告诉 scanf 忽略前面的换行符、制表符和空格
    【解决方案3】:

    你也可以使用

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

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

    【讨论】:

      猜你喜欢
      • 2012-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-20
      • 1970-01-01
      相关资源
      最近更新 更多