为什么我的C程序打印出相同的输出,无论我输入什么?

时间:2015-02-12 21:09:16

标签: c

我是C的新手,我一直在处理这个家庭作业问题大约2个小时无济于事。我尝试创建一个带字母电话号码的程序(即; CALLATT或1-800-COL-LECT)并将其转换为数字形式(2255288或1-800-265-5328)。不管我输入什么,我的输出总是得到-4197680。

int main(void){

    int c=0, len, a[len];   
    char n[len];

    printf("Enter phone number: \n");
    scanf("%c", n);

    len = sizeof(n) / sizeof(n[0]);

    while (len > c){
        if (n[c] == 'A' || n[c] == 'B' || n[c] == 'C'){
            a[c] = 2;       
            c++;
        }
        else if (n[c] == 'D' || n[c] == 'E' || n[c] == 'F'){
            a[c] = 3;       
            c++;
        }
        else if (n[c] == 'G' || n[c] == 'H' || n[c] == 'I'){
            a[c] = 4;       
            c++;
        }
        else if (n[c] == 'J' || n[c] == 'L' || n[c] == 'L'){
            a[c] = 5;       
            c++;
        }
        else if (n[c] == 'M' || n[c] == 'N' || n[c] == 'O'){
            a[c] = 6;       
            c++;
        }
        else if (n[c] == 'P' || n[c] == 'Q' || n[c] == 'R' || n[c] == 'S'){
            a[c] = 7;       
            c++;
        }
        else if (n[c] == 'T' || n[c] == 'U' || n[c] == 'V'){
            a[c] = 8;       
            c++;
        }
        else if (n[c] == 'W' || n[c] == 'X' || n[c] == 'Y' || n[c] == 'Z'){
            a[c] = 9;       
            c++;
        }
        else {
            a[c] = n[c];
            c++;
        }           
    }

    printf("%d\n", a);

    return 0;   
}

4 个答案:

答案 0 :(得分:3)

编辑:已修订。有很多评论指出了问题,这是我的答案,它适用于合理长度的电话号码。它会跳过任何非拨号字符,例如'-',它不属于电话号码。

#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main(void){
    int k, d, e, len;
    char dial[20], entry[20] = {0};
    printf("Enter phone number: ");
    fgets(entry, 19, stdin);
    len = strlen(entry);
    d = 0;                                 // dial string index of output
    for (e=0; e<len; e++) {                // entry string index of input
        k = entry[e];
        switch (toupper(k)) {
            case 'A': case 'B': case 'C':           dial[d++] = '2'; break;
            case 'D': case 'E': case 'F':           dial[d++] = '3'; break;
            case 'G': case 'H': case 'I':           dial[d++] = '4'; break;
            case 'J': case 'K': case 'L':           dial[d++] = '5'; break;
            case 'M': case 'N': case 'O':           dial[d++] = '6'; break;
            case 'P': case 'Q': case 'R': case 'S': dial[d++] = '7'; break;
            case 'T': case 'U': case 'V':           dial[d++] = '8'; break;
            case 'W': case 'X': case 'Y': case 'Z': dial[d++] = '9'; break;
            default:
                if (isdigit(k) || k=='*' || k=='#') dial[d++] = k;
        }
    }
    dial[d] = 0;          // terminate string
    printf("Dial %s\n", dial);
    return 0;   
}

答案 1 :(得分:0)

以下是一些代码:

char buf[32];
sscanf("%31s", buf);

size_t i;

for (i = 0; i < sizeof(buf) && buf[i]; ++i)
{
switch (buf[i])
{
case 'A': case 'B': case 'C':
    buf[i] = '2'; break; // Note: character literal, not integer
case 'D': case 'E': case 'F':
   buf[i] = '3'; break;
....
}
}
printf("%s", buf);

如果您有符合Posix的库,则可以使用动态分配:

char *buf;
scanf("%ms", &buf); //scanf would allocate memory

for (i = 0; buf[i]; ++i)
{
.....
}

printf("%s", buf);
free(buf);

答案 2 :(得分:0)

您的代码中存在很多问题,几乎需要重新编写才能使其正常工作。我认为你应该从小事做起。在添加更多功能之前确保它有效。我建议将main中的代码分为三个部分 - 读取电话号码,转换电话号码并打印转换后的电话号码。

这是一个捕获这三个步骤的骨架程序。

#define SIZE 50

void readPhoneNumber(char phoneNumber[])
{
}

void convertTextToNumber(char phoneNumber[], char dialedNumber[])
{
}

void printPhoneNumber(char phoneNumber[])
{
}

int main(void)
{
   char phoneNumber[SIZE];
   char dialedNumber[SIZE];

   readPhoneNumber(phoneNumber);

   convertTextToNumber(phoneNumber, dialedNumber);

   printPhoneNumber(dialedNumber);
}

现在,您可以开始充实这些功能。例如,readPhoneNumber可以实现为:

void readPhoneNumber(char phoneNumber[])
{
   printf("Enter phone number: \n");
   fgets(phoneNumber, SIZE, stdin);
}

printPhoneNumber可以实现为:

void printPhoneNumber(char phoneNumber[])
{
   printf("%s\n", phoneNumber);
}

我将让您完成convertTextToNumber的实施。

答案 3 :(得分:0)

这里有未定义的行为,len未初始化。

int c=0, len, a[len];   
char n[len];

改为使用常数值,我敢打赌您所在国家/地区的电话号码有一定的最大长度。


不推荐这种从键盘读取的方法,scanf不会检查字符串的长度,因此您可以在键盘上进行faceroll,程序将崩溃。而是使用fgets()从stdin读取然后通过char跳过包含的\n

来查看字符串char
printf("Enter phone number: \n");
scanf("%c", n);

这没有意义,你计算n的大小,即包含n的整数。如果你想要字符串的长度使用strlen(n);顺便说一下,尝试使用更多描述性的变量名称。

len = sizeof(n) / sizeof(n[0]);

而不是

while (len > c){

为什么不使用正常的for-loop?你好像到处都在增加c ++。


这里不会做你期望的事情

printf("%d\n", a);

但你指定'a'整数,例如

a[c] = 2;

printf不能神奇地打印一些你的数组,而是你要打印出来的是带有数字的字符串。数字的ascii值是48 +数字。例如'0'是48,通过知道它有一个字符缓冲区并向其添加ascii值。确保它以\ 0结束,这是字符串的结尾。然后打印出字符串

buf[c++] = 48 + digit;
...
buf[c] = '\0';   
puts( buf );