我正在尝试解决问题here,但我不知道为什么我的代码无效。任何帮助表示赞赏。编辑:编辑进行下面提到的修正,但在输出的第二行还有一个额外的“15”(粗体),我不明白它来自哪里。
我的输出是
18662658515 5552272的 15
#include <stdlib.h>
#include <stdio.h>
int main(void){
int n;
int j;
scanf("%d\n", &n);
int i = 0;
char mystr[15];
for(;i<n;i++){
fgets(mystr,15,stdin);
for(j=0;j<15;j++){
if(isdigit(mystr[j])){
printf("%c", mystr[j]);
continue;
}
if ('A' <= mystr[j] && mystr[j] <= 'C')
printf("2");
if ('D' <= mystr[j] && mystr[j] <= 'F')
printf("3");
if ('G' <= mystr[j] && mystr[j] <= 'I')
printf("4");
if ('J' <= mystr[j] && mystr[j] <= 'L')
printf("5");
if ('M' <= mystr[j] && mystr[j] <= 'O')
printf("6");
if ('P' <= mystr[j] && mystr[j] <= 'S')
printf("7");
if ('T' <= mystr[j] && mystr[j] <= 'V')
printf("8");
if ('W' <= mystr[j] && mystr[j] <= 'Z')
printf("9");
}
printf("\n");
}
}
答案 0 :(得分:6)
首先,我认为你的比较是倒退的。例如,您应该测试“if('A'&lt; = mystr [j]&amp;&amp; mystr [j]&lt; ='C')”。
答案 1 :(得分:3)
问题在于,无论输入的长度如何,您都在迭代输入字符串中的所有15个字符。第一个测试用例有11个字符,但第二个测试用例只有8个。在第二个迭代中,你不小心处理了第一个输入的最后两个字符,即15
。
要修复它,只需在点击NUL字符0时停止迭代,通过更改此行来终止字符串
for(j=0;j<15;j++){
到
for(j=0; mystr[j] != 0; j++){
答案 2 :(得分:2)
或许,在()之间有一个函数会有帮助(道歉;我的C生锈了):
bool between(char c, char before, char after) {
return before <= c && c <= after;
}
所以
if ('A' <= mystr[j] && mystr[j] <= 'C')
printf("2");
成为
if (between(mystr[j], 'A', 'C')
printf("2");
通常最好使用半开放范围,其中下限是包含的,上限是独占的。这样,每个测试的最后一个元素将是前一个测试的第一个元素,它可以帮助您更容易地检测某些类型的错误。
答案 3 :(得分:1)
考虑您可能希望以相同的顺序比较事物。在编写代码之前用简单的英语说出来。如果myLetterCode大于A.code&amp;&amp; myLetterCode小于C.Code(必须是B!)。
将您的信件保留在左侧,将您正在比较的信息放在右侧。否则它会非常快速地混乱。
答案 4 :(得分:1)
使用查找表会不会更容易?
int numbers[] = { 2, 2, 2, 3, 3, 3,
4, 4, 4, 5, 5, 5, 6, 6, 6,
7, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9};
... cut ...
if (isdigit (mystr[j]))
printf ("%c", mystr[j]);
else
printf ("%d", numbers[mystr[j] - 'A']);
... cut ...