自己看书学C语言,遇到一道练习题不知道怎么解决,也没有答案,求助。。
题目如下:
编写程序可以把字母格式的电话号码翻译成数值格式,
譬如:
Enter phone number: CALLATT
2255288
或者:
Enter phone number: 1-800-COL-LECT
1-800-265-5328
对应关系:2=ABC,3=DEF,4=GHI,5=JKL,6=MNO,7=PQRS,8=TUV,9=WXYZ
请教下这个问题的解决思路是什么!
一开始的思路是利用scanf函数只提取所需的数据类型然后保留其他的数据的特点,希望用两条scanf函数分别提取输入内容的字符和数字信息,然后转换字符为对应数字,然后统一printf
但是不知道为什么:
scanf("%c", &alpha);
scanf("%d", &rest);
输入值为1-800-COL-LECT
提取出来后,alpha的值为1,rest值为-800
也请教下这个问题是咋回事!
谢谢!
1
Reficul 2015-04-12 19:16:15 +08:00 via Android
%c是单个字符,%d是一个数字。
第一个1赋值给了alpha,后面的来匹配一个数字给rest。-800后面一个-号不是数字了,所以到此为止,-800给rest。 你这个用字符串输入, |
2
Reficul 2015-04-12 19:18:30 +08:00 via Android
抱歉,打一半按错了。
%c是单个字符,%d是一个数字。 第一个1赋值给了alpha,后面的来匹配一个数字给rest。-800后面一个-号不是数字了,所以到此为止,-800给rest。 你这个用字符串输入,即%s,字符串从头到后一个个匹配输出就好了吧? |
3
CDuXZMAPgHp1q9ew 2015-04-12 19:32:03 +08:00
while((c = getchar()) != EOF) {
if (isdigtal(c)) print c; else print (c-'A')/3+2 } |
4
CDuXZMAPgHp1q9ew 2015-04-12 19:32:34 +08:00
@wujichao 擦 没考虑 '-' ....
|
5
rundis OP @Reficul 但是scanf函数要的是一个char类型的数据啊,为什么1被当做是char类型的数据录入?不是应该遇到非char型就略过,然后提取char型吗?
|
7
rundis OP 问题已经解决,下面放源码:
#include <stdio.h> int main(void) { char ch; printf("Enter phone number: "); while ((ch = getchar()) != '\n') { if (ch == 'A' || ch == 'B' || ch == 'C') printf("2"); else if (ch == 'D' || ch == 'E' || ch == 'F') printf("3"); else if (ch == 'G' || ch == 'H' || ch == 'I') printf("4"); else if (ch == 'J' || ch == 'K' || ch == 'L') printf("5"); else if (ch == 'M' || ch == 'N' || ch == 'O') printf("6"); else if (ch == 'P' || ch == 'Q' || ch == 'R' || ch == 'S') putchar('7'); else if (ch == 'T' || ch == 'U' || ch == 'V') putchar('8'); else if (ch == 'W' || ch == 'X' || ch == 'Y' || ch == 'Z') putchar('9'); else putchar(ch); } return 0; } |
8
Septembers 2015-04-12 20:21:32 +08:00
@rundis
if (ch == 'A' || ch == 'B' || ch == 'C') 可优化成 if (ch => 'A' && ch =< 'C') |
9
Exin 2015-04-12 23:19:38 +08:00
@Septembers 还可以这样优化:
if (ch<'S') printf char((ch-'A')/3+2);//不知道C的强制类型转换能不能这样,我只写过c++的确认是可以的 else ...(原来的版本 |
10
Reficul 2015-04-13 00:25:50 +08:00 via Android
@rundis
%c是char类型的,你那个1会被认为char类型读入的。另外alpha不是数字的1,是ASCII码的'1'。 键盘输入的字符,包括回车空格啥的,都是可以被scanf的%c读入的。。。。 |
11
rundis OP @Septembers 谢谢谢谢!这么优化的确很好!
|