【问题标题】:Multiple printf/scanf affecting output多个 printf/scanf 影响输出
【发布时间】:2016-01-29 02:57:11
【问题描述】:

我有一个由两部分组成的简单程序。

一部分询问您最喜欢的号码,然后返回您最喜欢的号码。

另一部分询问您最喜欢的字母是什么,并返回该字符的 ASCII 码。

各部分相互独立工作,当代码中最喜欢的字母部分在代码中最喜欢的数字部分前面时,两个部分都按顺序正确执行。

但是,当我修改代码的顺序以使最喜欢的数字部分位于最喜欢的字母部分之前时,我遇到了问题。输出允许我输入我最喜欢的数字,然后它会扫描并返回。然后它只打印程序的其余部分,不允许我输入我最喜欢的字母。

正确运行的代码:

#include <stdio.h>

int main() {
    int favorite_number;
    char favorite_letter;
    int favorite_letter_code;

    /* FAVORITE LETTER */
    printf("Enter your favorite letter> \n");
    scanf("%c", &favorite_letter);
    favorite_letter_code = (int)favorite_letter;
    printf("The ASCII code for your favorite letter is is %d\n", 
           favorite_letter_code);

    /* FAVORITE NUMBER */
    printf("Enter your favorite number> \n");
    scanf("%d", &favorite_number);
    printf("Your favorite number is %d!\n", favorite_number); 

    return 0;
}

工作不正常的代码(只需切换最喜欢的字母和最喜欢的数字部分):

#include <stdio.h>

int main() {
    int favorite_number;
    char favorite_letter;
    int favorite_letter_code;

    /* FAVORITE NUMBER */
    printf("Enter your favorite number> \n");
    scanf("%d", &favorite_number);
    printf("Your favorite number is %d!\n", favorite_number); 

    /* FAVORITE LETTER */
    printf("Enter your favorite letter> \n");
    scanf("%c", &favorite_letter);
    favorite_letter_code = (int)favorite_letter;
    printf("The ASCII code for your favorite letter is is %d\n", 
           favorite_letter_code);

    return 0;
}

为什么这个顺序会影响输出?

【问题讨论】:

  • 你试过检查scanf的返回码吗?

标签: c printf scanf


【解决方案1】:

在阅读favorite_numberscanf 后,您键入的换行符仍在stdin 中等待,阅读favorite_letter 时应忽略空格以跳过它:

scanf(" %c", &favorite_letter);

注意%c前面的空格,它告诉scanf忽略任何空格。

【讨论】:

    【解决方案2】:

    当您执行scanf("%d", ...) 时,它会读取一个整数。在控制台上输入文本时,输入一个整数,然后按 Enter。 scanf 调用不会消耗由回车键生成的换行符(它保留在输入缓冲区中)。当您执行scanf("%c", ...) 时,它会看到缓冲区中已经存在一个字符(换行符)并读取它而不是您所期望的。您需要明确说明该换行符。这是使用 scanf 时比较烦人的部分之一

    【讨论】:

      猜你喜欢
      • 2020-11-14
      • 2012-11-24
      • 2017-07-16
      • 1970-01-01
      • 1970-01-01
      • 2020-12-28
      • 1970-01-01
      • 2023-03-08
      • 2020-02-16
      相关资源
      最近更新 更多