【问题标题】:The output does not match with the input (C language)输出与输入不匹配(C语言)
【发布时间】:2021-11-19 19:41:37
【问题描述】:

我正在制作一个简单的 C 程序,它会询问您的年龄和性别。如果您的性别不是 M 或 F,程序将要求输入不同的输入。如果您的年龄小于零,程序将需要另一个输入。这是我的代码:

#include<stdio.h>

int main(){
    
    int a;
    char g;
    
    entry:
    printf("%s","AGE : ");
    scanf("%d", &a);
    getchar();
    
    insert:    
    printf("%s","GENDER :");
    scanf("%s", &g);
    getchar(); 
    
    while (a < 0){
        goto entry;
        }
    
    switch(g){
        
        case 'M':{
            printf("I am a %d yr old male", a);break;
        }
        case 'F':{
            printf("I am a %d yr old female", a);break;
        }
        default:{
            goto insert; break;
        }
    }

    return 0;
}

这是一个程序运行的例子

年龄:21

性别:男

我是一个0岁的男性

【问题讨论】:

  • goto 在 C 程序中有适当的用途。您对它的使用不是其中之一。使用forwhiledo ... while 来实现循环。
  • 更喜欢使用fgets 来读取用户的输入行。然后使用 sscanf 或 strtok 或其他字符串处理技术从行中提取值。这可以防止 scanf 卡住或留下部分行的问题。
  • 作为 UI 说明,假设两个最常见的性别适用于每个人将导致一些用户极度沮丧。

标签: c while-loop switch-statement repeat


【解决方案1】:

虽然我在代码中发现了一个奇怪的地方(见大注释),但它会按您的预期输出,因此您可以使用这样的方法:

#include<stdio.h>
#include<stdbool.h>

int main(){

    int age, a;
    char g;
    bool validInput;

    do {
        validInput = true;

        printf("%s","AGE : ");
        scanf("%d", &age);
        /*
         * If you use directly the 'a' var, somehow it will not print
         * input age. That's why I had to use a = age assignment.
         * This is weird, if someone knows why this happens let me
         * know please.
         */
        a = age;
        if(a < 0) {
            validInput = false;
        }

        printf("%s","GENDER : ");
        scanf("%c", &g);
        getchar();
        if(g != 'M' && g != 'F') {
            validInput &= false;
        }

    } while(!validInput);

    switch(g){

        case 'M':
            printf("I am a %d yr old male\n", a); break;
        case 'F':
            printf("I am a %d yr old female\n", a); break;
        default:
            printf("Oops! Something went wrong...\n");
    }

    return 0;
}

【讨论】:

  • 您正在尝试将字符串放入g。变量g 不足以容纳非空字符串。您是否打算使用%c 作为格式说明符?
  • @HAL9000 我从问题中复制了作者的代码并对其进行了修改。所以你是对的,但是在评论部分我问了一个问题,为什么整数输入不能在 switch case 上下文中生存,除非我使用另一个 var?
  • @RonaldHirsch 很高兴你能成功。如果此答案有效,或者您请考虑将其作为解决方案进行检查。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-18
  • 1970-01-01
  • 1970-01-01
  • 2018-03-03
  • 1970-01-01
  • 2017-09-06
相关资源
最近更新 更多