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
我做错了什么?
你的想法是正确的,但你的计划中有两件事是缺失的:
最重要的是,字符串末尾的空终止符。在读取数字的
1 | alphabetic[i] = '\0'; |
如果用户输入小写字母,则会在
您没有将空终止符放在任何地方,所以在读取字符串时,不管您后来是否修改了它,它都是未定义的行为。写这行:
1 | alphabetic[num_elements] = 0; |
在你的
就我个人而言,我不会执行
1 2 | scanf("%49s", alphabetic); // reads in a string up to 50 characters for (i = 0; alphabetic[i]; i++) { ... |
号