当前位置: 首页 > 知识库问答 >
问题:

开关函数有一个奇怪的“扫描”返回

闻鹤龄
2023-03-14

我正在开发一个具有简单开关功能的程序,到目前为止,它一直对我有效。但是这次我在开关前的scanf函数有问题。老实说,我不明白错误可能在哪里。这是代码:

#include <stdio.h>
#include <stdlib.h>


int main () {
int utente;
while(1) {
printf("Benvenuto, premere:\n");
printf("1) AZIONE 1\n");
printf("2) AZIONE 2\n");
printf("3) AZIONE 3\n");
printf("4) AZIONE 4\n");
printf("5) AZIONE 5\n");
printf("6) AZIONE 6\n");
scanf ("%d\n",&utente);
switch(utente) {
        case 1: {
                printf("AZIONE 1\n");
                break;
        }

        case 2:{
                printf("AZIONE 2\n");
                break;
        }
        case 3: {
                printf("AZIONE 3\n");
                break;
        }
        case 4: {
                printf("AZIONE 4\n");
                break;
        }
        case 5: {
                printf("AZIONE 5\n");
                break;
        }
return 0

我无法理解回报。扫描后,他要求我输入另一个输入以进入开关。否则它不会进入。在while的情况下,我重复这个循环,并在房屋上延迟输出。这是一个非常简单的程序。我不知道是开关问题还是扫描问题。请帮忙。

共有2个答案

王佐
2023-03-14

由于scanf语句中格式说明符(%d)后面的新行\n,您遇到了麻烦。

太叔繁
2023-03-14

scanf格式字符串中的空白字符(空格、换行符、制表符等)意味着它将忽略输入中的任意数量的空白。因此,当您点击ENTER(发送换行符)时,它将被忽略,无论您发送多少。为了终止此指令,您必须输入一个非空白字符。

根据C11标准:

由空白字符组成的指令通过读取输入直到第一个非空白字符(仍未读取)或直到无法读取更多字符来执行。指令永远不会失败。

这就是你在这里观察到的。

解决方案是从格式字符串中删除\n

请注意,scanf对于用户输入通常很容易出错,并且很难正确使用(请参阅如果您向程序输入非整数,例如a,会发生什么情况)。

为什么每个人都说不要使用scanf?我应该用什么来代替?

 类似资料:
  • 我正在尝试找出存储在一个匹配Redis模式的键列表中的值。我尝试使用以便稍后使用获取所有值,但问题是: 返回所需的键。如何强制查看所有现有键?我得去查lua吗?

  • 鉴于以下代码: 为什么开关语句在上匹配? 我的理解是,当时,不匹配,因为(实际上)计算结果为false。VS Code上的IntelliSense告诉我,也是一个

  • 问题内容: 有没有人看到像这样的方法签名后放置的数组? 版画 过去,“ C”兼容性是一种奇怪的表示法,但我也无法想象有人用C编写这种代码。 有谁知道为什么甚至允许这样做? 如果有问题,我正在使用Java 7 update 10。 这与Java 6中的功能相同。http://ideone.com/91rZV1 顺便说一句,这不会编译,我也不希望它编译 问题答案: 有谁知道为什么甚至允许这样做? 在这

  • 我有以下C代码: 当我为两个scanf输入正常整数和双精度值时,它运行良好。但是我想让它更健壮。如果我为int scanf输入一个十进制值,代码将直接跳到下一个printf,并跳过scanf以获得double。它将我在int中输入的小数部分打印为双精度值。 eg: hello world,我是一个返回值为10的函数 现在输入一个值:44.67 所以您输入了值:44 现在输入一个双精度值:直到4的双

  • 我们以一种混乱的方式设置ETL项目,只是为了完成一项工作: 这个项目依赖于其他几个Spring项目,所以我们将这些项目作为依赖项包括在内。这些项目包含它们自己的@配置类,可能会导致冲突。我现在处于这样一种状态,我在我的ETL项目中设置了一个动态存储库,但它没有被自动构建,抛出一个错误: com中的构造函数。迈特尔。服务impl。ErrorServiceImpl需要“com”类型的bean。迈特尔。

  • 我试图扫描一个整数,并运行一个循环来扫描字符串,直到那个整数。但这段代码跳过了第一个字符串... 有解决办法吗?