C 将电话号码从字母形式转换为数字形式

C 将电话号码从字母形式转换为数字形式,c,arrays,character,C,Arrays,Character,我正在做一个来自肯金斯著作《C编程:现代方法》的练习,它涉及将用户输入的字母形式的电话号码转换成数字形式。当程序遇到非字母字符(例如数字或标点符号)时,应保持不变。我可以假设用户只输入大写字母 然而,至少可以说,我的程序似乎产生了垃圾 #include <stdio.h> #define MAX_SIZE 50 int main(void) { char alphabetic[MAX_SIZE], ch; int num_elements = 0; pr

我正在做一个来自肯金斯著作《C编程:现代方法》的练习,它涉及将用户输入的字母形式的电话号码转换成数字形式。当程序遇到非字母字符(例如数字或标点符号)时,应保持不变。我可以假设用户只输入大写字母

然而,至少可以说,我的程序似乎产生了垃圾

#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()) != '\n'); 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\n", alphabetic);
    return 0;
}
#包括
#定义最大尺寸50
内部主(空)
{
字符字母[MAX_SIZE],ch;
int num_元素=0;
printf(“输入电话号码:”);
int i;
对于(i=0;i对于(i=0;i您没有在任何位置放置空终止符,因此在读取字符串时它是未定义的行为,无论您之后是否对其进行了修改。请放置此行:

alphabetic[num_elements] = 0;
在您的
for(i=0;i
循环之后


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

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

您的想法是正确的,但您的计划中缺少两件事:

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

    alphabetic[i] = '\0';
    
  • 如果用户输入小写字母,则在
    switch
    语句中忽略它们。为了避免这种情况,可以将
    包括在内,并将
    switch
    数量从
    字母[i]
    更改为
    toupper(字母[i])
    。对已经大写的字母调用
    toupper
    是良性的


  • ch
    应该是
    int
    @Lundin您能解释一下原因吗?@Shuster与您的问题无关,但您缺少
    Q
    Z
    的大小写。@Shuster因为getchar返回int,而EOF是int。@GovindParmar这一点我不知道。但我不确定您对“最近”的定义准确地说,我的第一部手机(20年前左右)已经有了Q和Z;-)首先,感谢您的帮助,但是有没有办法确保在程序读取完字符后自动添加空终止符?@Shuster要实现这一点,您应该使用一种实际用于读取字符串而不是单个字符的方法(即
    getchar
    )从
    stdin
    fgets
    是一个很好的选择。这不太正确。输入格式说明符“s”总是在输入后附加一个NUL字节,因此语句应该是:
    scanf(“%49s”,字母);