我是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;
}
答案 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
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 );