关于C#:将电话号码从字母转换为数字形式

Convert phone number from alphabetic to numeric form

我正在做一个练习,从Knkings的书"C编程:一个现代的方法",包括转换电话号码的字母形式,由用户输入,成数字形式。当程序遇到非字母字符(例如数字或标点符号)时,应该保持它们不变。我可以假设用户只输入大写字母。

不过,至少可以说,我的程序似乎产生了垃圾。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <stdio.h>

#define MAX_SIZE 50

int main(void)
{
    char alphabetic[MAX_SIZE], ch;
    int num_elements = 0;

    printf("Enter phone number:");
    int i;
    for (i = 0; i < MAX_SIZE && ((ch = getchar()) != '
'
); i++){
        alphabetic[i] = ch;
        num_elements++;
    }

    for (i = 0; i <= num_elements; i++){
        switch (alphabetic[i]){
            case 'A': case 'B': case 'C': alphabetic[i] = '2'; break;
            case 'D': case 'E': case 'F': alphabetic[i] = '3'; break;
            case 'G': case 'H': case 'I': alphabetic[i] = '4'; break;
            case 'J': case 'K': case 'L': alphabetic[i] = '5'; break;
            case 'M': case 'N': case 'O': alphabetic[i] = '6'; break;
            case 'P': case 'R': case 'S': alphabetic[i] = '7'; break;
            case 'T': case 'U': case 'V': alphabetic[i] = '8'; break;
            case 'W': case 'X': case 'Y': alphabetic[i] = '9'; break;
            default:                                           break;
        }
    }
    printf("%s
"
, alphabetic);
    return 0;
}

特别是,我输入:collect-800。它输出类似这样的结果:u?@K

我做错了什么?


你的想法是正确的,但你的计划中有两件事是缺失的:

  • 最重要的是,字符串末尾的空终止符。在读取数字的for循环之后,添加行:

    1
    alphabetic[i] = '\0';
  • 如果用户输入小写字母,则会在switch语句中忽略它们。为了解决这个问题,包括,将switch的数量从alphabetic[i]改为toupper(alphabetic[i])。在已经大写的字母上调用toupper是良性的。


  • 您没有将空终止符放在任何地方,所以在读取字符串时,不管您后来是否修改了它,它都是未定义的行为。写这行:

    1
    alphabetic[num_elements] = 0;

    在你的for (i = 0; i < MAX_SIZE &&...循环之后。

    就我个人而言,我不会执行getchar循环,而是这样读取字符串:

    1
    2
    scanf("%49s", alphabetic); // reads in a string up to 50 characters
    for (i = 0; alphabetic[i]; i++) { ...