V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
rundis
V2EX  ›  问与答

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

  •  
  •   rundis · 2015-04-12 19:00:46 +08:00 · 2160 次点击
    这是一个创建于 3511 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    谢谢!

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

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

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

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

    键盘输入的字符,包括回车空格啥的,都是可以被scanf的%c读入的。。。。
    rundis
        11
    rundis  
    OP
       2015-04-13 07:48:08 +08:00 via iPhone
    @Septembers 谢谢谢谢!这么优化的确很好!
    rundis
        12
    rundis  
    OP
       2015-04-13 08:24:56 +08:00 via iPhone
    @Exin 但是比如i就是第八个字母,ch-'A'=8,8/3=2,2+2=4,但是i应该输出3
    rundis
        13
    rundis  
    OP
       2015-04-13 08:26:13 +08:00 via iPhone
    @Exin 把+2改成+1,因为除法运算符是向下取整一位
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3539 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 10:24 · PVG 18:24 · LAX 02:24 · JFK 05:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.