我是C的新手。我在GWBASIC方面经验丰富。为了学习,我试图编写一个程序,将字符串中的各个字符转换为数值,如下所示:
1 2 3 4 5 6 7 8 9
a b c d e f g h i
j k l m n o p q r
s t u v w x y z
例如,字符串A的用户输入可能是“狗”, 所述程序然后将[d] [o] [g]存储为字符串B中的[4] [6] [7]。 下面的代码适用于最多四个字符的字符串,但必须有一种更有效的方法。
int main()
{
char a[0];
char b[0];
scanf("%s",a);
if (a[0] == 'a' || a[0] == 'j' || a[0] == 's') b[0] = '1';
if (a[0] == 'b' || a[0] == 'k' || a[0] == 't') b[0] = '2';
if (a[0] == 'c' || a[0] == 'l' || a[0] == 'u') b[0] = '3';
if (a[0] == 'd' || a[0] == 'm' || a[0] == 'v') b[0] = '4';
if (a[0] == 'e' || a[0] == 'n' || a[0] == 'w') b[0] = '5';
if (a[0] == 'f' || a[0] == 'o' || a[0] == 'x') b[0] = '6';
if (a[0] == 'g' || a[0] == 'p' || a[0] == 'y') b[0] = '7';
if (a[0] == 'h' || a[0] == 'q' || a[0] == 'z') b[0] = '8';
if (a[0] == 'i' || a[0] == 'r') b[0] = '9';
if (a[1] == 'a' || a[1] == 'j' || a[1] == 's') b[1] = '1';
if (a[1] == 'b' || a[1] == 'k' || a[1] == 't') b[1] = '2';
if (a[1] == 'c' || a[1] == 'l' || a[1] == 'u') b[1] = '3';
if (a[1] == 'd' || a[1] == 'm' || a[1] == 'v') b[1] = '4';
if (a[1] == 'e' || a[1] == 'n' || a[1] == 'w') b[1] = '5';
if (a[1] == 'f' || a[1] == 'o' || a[1] == 'x') b[1] = '6';
if (a[1] == 'g' || a[1] == 'p' || a[1] == 'y') b[1] = '7';
if (a[1] == 'h' || a[1] == 'q' || a[1] == 'z') b[1] = '8';
if (a[1] == 'i' || a[1] == 'r') b[1] = '9';
if (a[2] == 'a' || a[2] == 'j' || a[2] == 's') b[2] = '1';
if (a[2] == 'b' || a[2] == 'k' || a[2] == 't') b[2] = '2';
if (a[2] == 'c' || a[2] == 'l' || a[2] == 'u') b[2] = '3';
if (a[2] == 'd' || a[2] == 'm' || a[2] == 'v') b[2] = '4';
if (a[2] == 'e' || a[2] == 'n' || a[2] == 'w') b[2] = '5';
if (a[2] == 'f' || a[2] == 'o' || a[2] == 'x') b[2] = '6';
if (a[2] == 'g' || a[2] == 'p' || a[2] == 'y') b[2] = '7';
if (a[2] == 'h' || a[2] == 'q' || a[2] == 'z') b[2] = '8';
if (a[2] == 'i' || a[2] == 'r') b[2] = '9';
if (a[3] == 'a' || a[3] == 'j' || a[3] == 's') b[3] = '1';
if (a[3] == 'b' || a[3] == 'k' || a[3] == 't') b[3] = '2';
if (a[3] == 'c' || a[3] == 'l' || a[3] == 'u') b[3] = '3';
if (a[3] == 'd' || a[3] == 'm' || a[3] == 'v') b[3] = '4';
if (a[3] == 'e' || a[3] == 'n' || a[3] == 'w') b[3] = '5';
if (a[3] == 'f' || a[3] == 'o' || a[3] == 'x') b[3] = '6';
if (a[3] == 'g' || a[3] == 'p' || a[3] == 'y') b[3] = '7';
if (a[3] == 'h' || a[3] == 'q' || a[3] == 'z') b[3] = '8';
if (a[3] == 'i' || a[3] == 'r') b[3] = '9';
printf("%s\n",b);
return 0;
}
答案 0 :(得分:6)
假设您的编译器使用ASCII编码,那么您可以使用以下简单算法来获得答案:
1 + (strA[i] - 'a') % 9
你真的不希望用一长串if
语句或switch
语句来实现它。
如果您有非字母字符,数字字符,大写字符等,您自然会遇到输入验证问题。我认为你可以简单地忽略那些学习练习。
答案 1 :(得分:2)
要纠正原始方法,您需要做两件事:
==
检查是否相等; ;
终止声明。...所以你的代码段变成:
if (strA[0] == 'a')
strB[0] = '1';
if (strA[0] == 'b')
strB[0] = '2';
if (strA[0] == 'c')
strB[0] = '3';
答案 2 :(得分:2)
您可以在gwbasic编辑器中输入以下内容,它将解决您的问题
10 INPUT A$
12 L = LEN(A$)
15 FOR T = 1 TO L
20 M$ = MID$(A$,T,1)
25 GOSUB 70
30 B$ = B$ + V$
35 NEXT T
40 PRINT B$
50 END
55 REM -----------------
70 REM - Subroutine to convert m$ into v$
72 X = ASC(M$) : REM this is the ascii value of m$ (eg. "a" = 97)
74 X = X - 96 : REM so that 97 becomes "1"
80 IF X > 9 THEN X = X - 9 : GOTO 80
90 V$ = STR$(X) : REM just converting to a string type variable
95 RETURN : REM takes you back to line 30 where this value is added to the
96 REM final resulting B$ - when I say added I mean a char added to a string
97 REM such that "APPL" + "E" = "APPLE"
98 REM ------------------------------------------ DONE
答案 3 :(得分:1)
对于ASCII,它有点像:
... make sure strB has enough space ...
for (i = 0; i < ... length of strA ... ; i++) {
/* you should always check your input is valid */
if (strA[i] >= 'a' && strB[i] <= 'z')
strB[i] = (strA[i] - 'a') % 9 + 1;
else
strB[i] = ... some default value ...
}
对于EBCDIC:
for (i = 0; i < ... length of strA ... ; i++) {
/* you should always check your input is valid */
if (strA[i] >= 'a' && strB[i] <= 'r')
strB[i] = strA[i] & 0xF;
else if (strA[i] >= 's' && strB <= 'z')
strB[i] = (strA[i] & 0xF) - 1;
else
strB[i] = ... some default value ...
}
答案 4 :(得分:0)
仔细查看ASCII表。您将看到所有字母都使用某个整数值进行编码。首先,如果您只有小写字母,那么从任何字母中删除'a'的字符代码就足以得到您想要的内容
int nr = strA[0] - 'a' + 1;
//now you'd need to convert back to a string; better: strB should be an array of integer
此外,=
是赋值运算符;您需要使用==
来检查是否相等。
答案 5 :(得分:0)
试试这个:)
int strB[MAX_LEN] = {0};
char *strA = malloc (MAX_LEN * sizeof(char));
int i,c = 0,x;
scanf("%s",strA);
for(i = 0 ; i<strlen(strA) ; i++){
x = strA[i] - 'a' + 1;
if(x >= 1 && x <= 9)
strB[c] = x;
else if(x <= 18){
strB[c] = x - 10;
else if(x <= 26){
strB[c] = x - 19;
if(x <= 26)
c++;
}
或者你可以在for循环中使用ninjalj方法,如果你经常检查输入:
for(i=0 ; i<strlen(strA) ; i++){
strB[i] = (strA[i] - 'a') % 9 + 1;
}
或者这个:
for(i=0 ; i<strlen(strA) ; i++){
if(strA[i] >= 'a' && strA[i] <= 'z'){
strB[c] = (strA[i] - 'a') % 9 + 1;
c++;
}
}