`putchar`的以下两种用法有什么区别?

时间:2017-02-27 20:08:18

标签: c if-statement switch-statement getchar putchar

我正在编写一些代码,我在程序的一个部分中获得了意外的输出,这反过来又破坏了整个系统。

代码可以简化并缩短为:

char ch;
printf("Enter Number: ");

while ((ch = getchar()) != '\n') {
   if (ch >= 65 && ch <= 67)  {
         ch = 2;
   }
   putchar(ch);
}

根据上面的代码,我试图打印用户选择的字符/整数序列。数字应保持不变,而如果用户输入字母A,则应打印2

预期输出

Enter Number: 23-AB
23-22

实际输出

Enter Number: 23-AB
23-☺☺

一旦遇到这个问题,我决定调整一些东西并提出以下代码,这些代码完美无缺。它使用相同的方法但产生不同的输出:

char input;
printf("\nEnter Number: ");

while ((ch = getchar()) != '\n') {  

    switch (toupper(ch)) {   //toupper function not really needed since I am expecting the user to enter upper-case letters ONLY
    case 'A': case 'B': case 'C':
        printf("2");
        break;
    default:
        putchar(ch);
    }
}

预期输出

Enter Number: 23-AB
23-22

实际输出

Enter Number: 23-AB
23-22

我无法理解为什么我无法将第一个代码中输入的字符的ASCII值转换为单个整数。产出差异的原因是什么?我只是简单地改变了控制表达式的类型,从if-statementswitch-statement(或者我认为)。如何更改第一个代码以向我提供与第二个代码相同的输出?

1 个答案:

答案 0 :(得分:0)

在第一个版本中,设置ch=2;会使ch字符的ASCII值为2,而不是字符2。您的第一个版本中的ch=0x32;可能会起作用,因为ASCII 50 = 0x32是字符2。更容易(并且更好,正如风向标指出的那样)是ch='2';

在您的第二个版本中,您使用的是printf("2")。因此,编译器在处理字符串"2"时会为您生成ASCII值,就像ch='2';一样。试试printf("%d\n",'2');,您应该看到50