davidmou 发表于 2023-9-24 10:50:56

switch问题

# include <stdio.h>

int main(void)

{       
        char man;
        printf("输入东西:");
        while (1)
        {
                scanf_s("%d", &man);

                switch (man)
                {

                        case 'a':
                                printf("mans");
                                getchar();
                                break;

                        default:
                                printf("ma");
                }
               
        }
        return 0;
}


为什么显示屏会出现,
while 之后不用在执行scanf_s 函数吗

isdkz 发表于 2023-9-24 10:51:03

在这段代码中,输入的是字符类型的变量man,但是在scanf_s函数中使用了%d,应该使用%c来读取字符类型的输入。同时,在输入字符后,输入缓冲区中仍然存在一个换行符,这个换行符会被下一个scanf函数读取,导致程序出现问题。因此,应该在scanf_s函数之后使用getchar函数来清除输入缓冲区中的换行符。修改后的代码如下:

#include <stdio.h>

int main(void)
{
    char man;
    printf("输入东西:");
    while (1)
    {
      scanf_s("%c", &man, 1);
      getchar(); // 清除输入缓冲区中的换行符

      switch (man)
      {
            case 'a':
                printf("mans");
                break;

            default:
                printf("ma");
      }
    }
    return 0;
}

陶远航 发表于 2023-9-24 10:51:11

根据你提供的代码,存在以下问题:

1. %d 是用于读取整数的格式控制符,而你想读取字符,应该使用 %c 格式控制符。所以将 scanf_s("%d", &man); 改为 scanf_s("%c", &man);。

2. switch 语句中的 case 'a' 中的 'a' 应该是字符常量,而不是字符串常量,所以应该写成 case 'a':。

3. 在 default 分支中使用 printf("ma"); 应该加上换行符,即 printf("ma\n");。

针对你的问题,即为什么显示屏会出现屏幕截图,这与代码的逻辑无关。可能是你在执行代码时,意外触发了某些截屏快捷键或软件的截屏功能。请确保你在执行代码时没有触发任何截屏操作。

另外,在 while(1) 循环中,你需要在 default 分支中添加合适的退出条件,否则程序将无限循环打印 "ma"。你可以使用一个条件变量(如 int flag = 0;)来控制循环,当条件满足时修改 flag 的值,从而跳出循环。

修改后的代码如下:

#include <stdio.h>

int main(void) {
    char man;

    printf("输入东西:");
   
    while (1) {
      scanf_s("%c", &man);
      
      switch (man) {
            case 'a':
                printf("mans\n");
                getchar();
                break;
               
            default:
                printf("ma\n");
                // 添加退出循环的条件
                flag = 1;
      }

      if (flag == 1) {
            break;
      }
    }

    return 0;
}


请注意,在使用 scanf_s 函数时,确保你的编译环境支持该函数,并正确设置了预处理指令。如果出现编译或运行错误,请根据具体的开发环境和编译器进行调整。
如果问题已经解决,请设置最佳答案
页: [1]
查看完整版本: switch问题