【问题标题】:Use switch with number case and char case使用数字大小写和字符大小写的开关
【发布时间】:2016-11-18 13:57:58
【问题描述】:

我想创建一个switch 循环。

如果输入是从15。它会打印一个数字。否则它将打印"this is not a number"。如果输入是'e'switch 循环应该结束。

我可以输入数字部分,但我不知道如何输入'e'。它只是不会读。这是我的代码:

int main() {
int i,a = 0;
printf("Write something:");
scanf("%d", &i);
    do{
    switch (i)
    {
    case 1:
        printf("1");
        break;
    case 2:
        printf("2");
        break;
    case 3:
        printf("3");
        break;
    case 4:
        printf("4");
        break;
    case 5:
        printf("5");
        break;
    case 'e':
        a=1;
        break;
    default:
        printf("This is not a number”); 
        break;
    }
}while (a==0);}

我的问题是我无法输入'e' 或任何字符。因为如果我这样做,我将创建一个悖论循环,或者根本不工作。我哪里错了?

【问题讨论】:

  • 为什么你要在同一个 (int) 变量中混合字符和整数?
  • 什么是悖论循环
  • @UnholySheep 我想这是我初学者的错。练习告诉我用数字和字符'e'做案例。所以我有点迷失在这里,我尝试这样......
  • @AdrianoRepetti 当我制作一个没有结束的循环时。它不会停止运行,直到占用所有内存。对我来说,使用这段代码:它会不断打印“这不是一个数字”数千次。

标签: c char switch-statement case


【解决方案1】:

只需将整数视为这样的字符即可;

顺便说一句,您可能希望每次通过 while 循环读取一个新字符,否则您将永远被卡住打印。下面的默认情况允许我们跳出循环。

int main() {
    char i,a = 0;
    printf("Write something:");
    scanf("%c", &i);
    do{
        switch (i)
        {
        case '1':
        case '2':
        case '3':
        case '4':
        case '5':
            printf("%c",i);
            break;
        case 'e':
            a=1;
            break;
        default:
            printf("This is not a number"); 
            break;
        }
    }while (a==0);
}

【讨论】:

  • 您将哪些整数视为字符?您在开关中比较的所有值都是字符,而不是整数
  • @UnholySheep 他说`如果输入是从 1 到 5。它将打印一个数字。`那些整数(或在命令行中输入的任何整数。
  • 感谢您的帮助
【解决方案2】:

当你说'e'时,你实际上是在说“'e'的价值”。这是 ASCII 值。 'e' 的十进制值实际上是 101。

要完成这项工作,您可以使用char 数据类型。以 char 形式读取数据,并在您的 switch 语句中,而不是数字,使用 char 代替。例如

switch (i)
{
case '1': 
  //do something
  break;

【讨论】:

  • 不知道为什么投反对票,因为据我所知这是正确的。
  • 可能是因为不能保证在该机器上使用 ASCII。虽然是的,但它几乎总是 ASCII,例如,在某些情况下可能会使用 EBCDIC。
  • 或者您也错过了必须使用scanf("%c", &i); 的事实,因为仅仅更改变量的类型是不够的。
  • 也许你是对的。虽然我会说我没有错过它,但我只是省略了代码(以字符形式读取数据)。这似乎是一个学生的问题,所以我认为为他们编写代码对任何人都没有帮助。没什么大不了的。
  • 很明显 OP 仍然是初学者,所以值得一提的是,如果您键入“1”,%c%d 将不会产生相同的结果。同样如编辑日志中所示,最初没有“读取为字符”。
【解决方案3】:

您不能这样做,因为在您的 scanf 中您指定输入将是小数 (%d)。 如果要检查它是否是数字,则必须处理字符。 例如:

char c;
    while (42)
{
scanf("%c", &c);
if (getnbr(c) < 1 && getnbr(c) > 5)
     printf("%c", c);
else
     printf("This is not a number”); 
}

类似的东西......希望我能帮上忙。

【讨论】:

  • getnbr() 应该是什么?还是说没完没了的while(42)
  • 我的意思是 atoi() 我的错。
  • 对于无限循环,对我来说这是示例中的一个细节。
  • 如果你传入char,则atoi 将不起作用,因为它需要一个字符串为char *。如果目标是重复循环 42 次,那不是它的完成方式。它看起来更像是一个无限循环,在这种情况下,您应该使用while (1)for (;;) 代替,这不会产生误导,这个示例看起来更像是伪代码。伪代码很好,但要使其易于理解。
  • 确实是伪代码,如果理解不够,请见谅。
【解决方案4】:

您可以使用switch(char) 进行切换。将您的输入转换为char(因为它是 1 到 5,它可以是一个字符)。然后检查case '1':case '2'等。

编辑:您需要将输入作为字符

char i;
int a = 0
printf("Write something:");
scanf("%c", &i);

然后

switch(i){

【讨论】:

  • 这并不能解决 OP 无法输入 'e' 的问题
  • 无法进行投射。 ASCII 值 1 仍然是 SOH。您需要将其转换为字符,而不是强制转换。
  • 你说得对,我将编辑解决方案。但这个想法是他需要一个字符开关来做到这一点。
【解决方案5】:

其他人建议使用 %c 以便您不要将字符与整数混合,但您需要小心其余代码。您可能需要对 switch 语句进行强制转换。

int i;
printf("Input:\n");
scanf(" %c", &i);

switch ((char)i)
{
    case '1':
        printf("Got number 1\n");
        break;
    case '2':
        printf("Got number 2\n");
        break;
    case 'e':
        printf("GREAT\n");
        break;
}

编辑:Karston Koop 提出了一个很好的问题。我对演员表的推理只是整数 i 没有初始化。来自 scanf 的格式化写入只会初始化整数的整个 4 字节中的最低/最高(取决于硬件)字节 - 其余的可能会被垃圾填充,具体取决于为整数变量 i 保留的 4 字节堆栈上的内容.如果它是一个字符,所有位都将由 scanf 初始化。因此,我们只需要 switch 语句的低/高字节,因此需要强制转换。为了解决这个问题,你可以初始化 i = 0。然后演员就变得多余了。我会留下这个,因为它可能对将来的某人有用。感谢 Karston 就这个问题向我提问。

【讨论】:

  • ...或者只定义char i;
  • 公平点。但可能值得留下来突出可能的绊脚石。
  • 没有演员阵容会怎样?
  • @KarstenKoop 因为整数 i 未初始化,您将不知道在低/高字节(取决于系统)之外的剩余位中拥有什么 - 因此它可能是其他的东西字符代码。如果在声明时将 int 初始化为零,则不需要强制转换。但这就是 C 编程的细微差别;)
  • 那么未初始化的intchar 之间有什么区别?我没有看到演员阵容有任何影响。
猜你喜欢
  • 1970-01-01
  • 2020-03-01
  • 2011-01-16
  • 2020-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-08
  • 1970-01-01
相关资源
最近更新 更多