求助,初学者有道 C 语言的问题不会

2015-04-12 19:00:46 +08:00
 rundis

自己看书学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
也请教下这个问题是咋回事!

谢谢!

2164 次点击
所在节点    问与答
13 条回复
Reficul
2015-04-12 19:16:15 +08:00
%c是单个字符,%d是一个数字。
第一个1赋值给了alpha,后面的来匹配一个数字给rest。-800后面一个-号不是数字了,所以到此为止,-800给rest。

你这个用字符串输入,
Reficul
2015-04-12 19:18:30 +08:00
抱歉,打一半按错了。

%c是单个字符,%d是一个数字。
第一个1赋值给了alpha,后面的来匹配一个数字给rest。-800后面一个-号不是数字了,所以到此为止,-800给rest。

你这个用字符串输入,即%s,字符串从头到后一个个匹配输出就好了吧?
CDuXZMAPgHp1q9ew
2015-04-12 19:32:03 +08:00
while((c = getchar()) != EOF) {
if (isdigtal(c)) print c;
else print (c-'A')/3+2
}
CDuXZMAPgHp1q9ew
2015-04-12 19:32:34 +08:00
@wujichao 擦 没考虑 '-' ....
rundis
2015-04-12 19:36:28 +08:00
@Reficul 但是scanf函数要的是一个char类型的数据啊,为什么1被当做是char类型的数据录入?不是应该遇到非char型就略过,然后提取char型吗?
rundis
2015-04-12 19:39:01 +08:00
@wujichao 谢谢,已经帮了不少忙了!
rundis
2015-04-12 20:15:50 +08:00
问题已经解决,下面放源码:
#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;
}
Septembers
2015-04-12 20:21:32 +08:00
@rundis
if (ch == 'A' || ch == 'B' || ch == 'C') 可优化成 if (ch => 'A' && ch =< 'C')
Exin
2015-04-12 23:19:38 +08:00
@Septembers 还可以这样优化:
if (ch<'S')
printf char((ch-'A')/3+2);//不知道C的强制类型转换能不能这样,我只写过c++的确认是可以的
else
...(原来的版本
Reficul
2015-04-13 00:25:50 +08:00
@rundis
%c是char类型的,你那个1会被认为char类型读入的。另外alpha不是数字的1,是ASCII码的'1'。

键盘输入的字符,包括回车空格啥的,都是可以被scanf的%c读入的。。。。
rundis
2015-04-13 07:48:08 +08:00
@Septembers 谢谢谢谢!这么优化的确很好!
rundis
2015-04-13 08:24:56 +08:00
@Exin 但是比如i就是第八个字母,ch-'A'=8,8/3=2,2+2=4,但是i应该输出3
rundis
2015-04-13 08:26:13 +08:00
@Exin 把+2改成+1,因为除法运算符是向下取整一位

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/183266

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX