2011-11-30 157 views
1

我是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 

例如,对于字符串用户输入可以是“狗”, 表示程序然后将字符串B中的[d] [o] [g]存储为[4] [6] [7]。 下面的代码适用于字符串w /最多四个字符,但必须有更多这样做的有效方法。

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

'“d” - “a''等于'3'。 –

+0

请注意,在C中'='运算符是赋值,为了检查相等性,使用==运算符。你可以这样if(strA [0] =='a'|| strA [0] =='j'|| strA [0] =='s')strB [0] = 1; ...以及其他情况下的其他情况,为每个字符检查一次使用for或while循环,而不是使用递增值。 – akoso

+0

@rankep:我认为salicemspiritus希望'strB [0] ='1''而不是'strB [0] = 1'。 – ruakh

回答

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 

而且字符代码,=是赋值运算符;您需要使用==来检查是否相等。

6

假设你的编译器使用ASCII编码,那么你可以用下面简单的算术,让您的答案:

1 + (strA[i] - 'a') % 9 

你真的不想用if陈述或者确实是一个长长的清单来实现这个一个switch声明。

当然,如果您有非字母字符,数字字符,大写字母等,您将会遇到输入验证问题。我认为你可以简单地忽略那些学习练习。

+0

只是一个方面说明:根据提供的图表,我相信OP将不得不'%9'这个值。 – williamg

+0

@williamg我的猜测是图表需要更正! ;-) –

+0

我也会这么想,但在他的评论中,他使用了第1-9列,而不考虑这一行。然而,我有一个坏习惯,假设的东西... ;-) – williamg

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++; 
} 

,或者您可以使用ninjalj方法在for循环中,如果您已位于检查输入:

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++; 
    } 
} 
+0

为什么你动态分配'strA',如果'strB'是静态分配的? – Dave

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 ... 
} 
+0

+1 EBDIC不错的作品! –

+1

@DavidHeffernan:呃,好和EBCDIC在同一句话中,谁会想到? – ninjalj

+0

我需要定义我吗? 如果我不知道,我会得到一个错误。 – salicemspiritus

2

要纠正你原来的做法,你需要做两件事情:

  • 各地使用的字符常量单引号;
  • 使用==检查是否相等;
  • 终止对帐单;

...所以你的代码段变为:

if (strA[0] == 'a') 
    strB[0] = '1'; 
if (strA[0] == 'b') 
    strB[0] = '2'; 
if (strA[0] == 'c') 
    strB[0] = '3'; 
+0

正确。我从那以后学过这个,谢谢。 – salicemspiritus

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