Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我的C程序无论输入什么都输出相同的输出?_C - Fatal编程技术网

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

为什么我的C程序无论输入什么都输出相同的输出?,c,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"); s

我是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;   
}
下面是一些代码:

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);

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

#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;   
}
下面是一个骨架程序,它捕捉了这三个步骤

#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);
}
void printPhoneNumber(char phoneNumber[])
{
   printf("%s\n", phoneNumber);
}
printPhoneNumber
可以实现为:

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

我将让您研究
convertexttonumber

编辑的实现:修订版。有很多评论指出了问题,下面是我的答案,它与一个合理长度的电话号码一起工作。它会跳过任何非拨号字符,例如不属于电话号码的
'-'

#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;   
}
#包括
#包括
#包括
内部主(空){
int k,d,e,len;
字符拨号[20],条目[20]={0};
printf(“输入电话号码:”);
fgets(条目,19,标准DIN);
len=strlen(条目);
d=0;//输出的拨号字符串索引

对于(e=0;e这里有未定义的行为,len未初始化

int c=0, len, a[len];   
char n[len];
用常量代替,我打赌你们国家的电话号码有某种最大长度


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

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

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

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

而不是

while (len > c){
<为什么不使用正常for循环?似乎到处都在增加C++。< /P>
这里不会做你期望它做的事

printf("%d\n", a);
但是你分配了一个整数,例如

a[c] = 2;
printf无法神奇地打印数组中的数字,相反,您要打印的是一个带数字的字符串。数字的ascii值是48+位。例如,“0”是48,知道它有一个字符缓冲区并将ascii值添加到其中。请确保它以\0结尾,这是字符串的结尾。然后打印出字符串

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

不应该是
scanf(“%s”和&n)
?我在这里看到UB。
inta,len,a[len];
--
len
a
(和下一行中的
n
)使用时未初始化。还要注意,这是利用了C99的一个支持较差的功能(尽管至少GCC和CLang对它的支持还不错)。@Alvarontro:No.
scanf
使用指向缓冲区开头的指针,而不是指向指针的指针(不需要,因为它本身不分配任何内存)@Moreboam:我可以建议您总是在启用警告的情况下编译吗?如果您启用了警告,则会发现使用未初始化的变量。如果您使用的是GCC或CLang,请使用
-Wall
;如果您使用的是其他工具,请查看编译器手册以获取正确的开关。不,数组的大小是在遇到它们的定义时确定的d、 在您的情况下,使用适当大的号码可以避免问题。电话号码不会任意长。哇,非常感谢!似乎使用开关而不是while循环工作得更好。