Преобразование символов массива строк в числа - PullRequest
1 голос
/ 01 декабря 2011

Я новичок в 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] как [4] [6] [7] в строке B. Приведенный ниже код работает для строки с четырьмя символами, но для этого должен быть более эффективный способ.

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

Ответы [ 6 ]

6 голосов
/ 01 декабря 2011

Предполагая, что ваш компилятор использует кодировку ASCII, вы можете использовать следующую простую арифметику для получения ответа:

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

Вы действительно не хотите реализовывать это с длинным списком ifоператоры или даже оператор switch.

Естественно, у вас возникнут проблемы с проверкой ввода, если у вас есть не алфавитные символы, числовые символы, символы верхнего регистра и т. д.Я полагаю, вы можете просто проигнорировать их для учебного упражнения.

2 голосов
/ 20 ноября 2012

Вы можете напечатать следующее точно в редакторе 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
2 голосов
/ 01 декабря 2011

Чтобы исправить исходный подход, вам нужно сделать две вещи:

  • Использовать одинарные кавычки вокруг символьных констант;
  • Использовать == для проверки на равенство;
  • Завершить операторы с помощью ;.

... так что ваш фрагмент становится:

if (strA[0] == 'a')
    strB[0] = '1';
if (strA[0] == 'b')
    strB[0] = '2';
if (strA[0] == 'c')
    strB[0] = '3';
1 голос
/ 01 декабря 2011

Для 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 голосов
/ 01 декабря 2011

попробуйте это:)

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 голосов
/ 01 декабря 2011

Присмотритесь к таблице 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

Кроме того, = является оператором присваивания;вам нужно использовать == для проверки на равенство.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...