Работа с Атои - PullRequest
       15

Работа с Атои

1 голос
/ 29 апреля 2011

Я атаковал Атои с нескольких разных углов, пытаясь извлечь целые числа из строки по 1 цифре за раз.

Проблема 1 - Определение размера массива
Должен ли этот массив из 50 символов иметь размер 50 или 51 (для учета нулевого терминатора)?

char fiftyNumbersOne[51] = "37107287533902102798797998220837590246510135740250";

Задача 2 - выходной сигнал

Что я здесь не так делаю?

char fiftyNumbersOne[51] = "37107287533902102798797998220837590246510135740250";
int one = 0;
char aChar = fiftyNumbersOne[48];
printf("%c\n",aChar);//outputs 5 (second to last #)
one = atoi(&aChar);
printf("%d\n",one);//outputs what appears to be INT_MAX...I want 5

Ответы [ 4 ]

7 голосов
/ 29 апреля 2011

Задача 1

Массив должен быть длиной 51. Но вы можете избежать необходимости вычислять это вручную, просто набрав char fiftyNumbersOne[] = "blahblahblah";.

Задача 2

aChar не является указателем на исходную строку ;это просто изолированный char, плавающий где-то в памяти.Но atoi(&aChar) обрабатывает его так, как если бы он был указателем на строку с нулевым символом в конце.Он просто идет по памяти, пока не находит где-то 0, а затем интерпретирует все, что он нашел, как строку.

Вы, вероятно, хотите:

one = aChar - '0';

Это зависит от тогочто значения символов от 0 до 9 гарантированно будут смежными.

3 голосов
/ 29 апреля 2011
  1. 51.
  2. Это потому, что aChar не заканчивается нулем.Если вы просто хотите получить целое значение char, просто используйте

    one = aChar - '0';
    
1 голос
/ 29 апреля 2011

Проблема 1 - Определение размера массива этот массив из 50 символов будет размером 50 или 51 (для учета нуля терминатор)

Вы всегда хотите, чтобы массив был больше, чем нужно хранить в нем (чтобы учесть нулевой терминатор). Таким образом, ваши 50 символов должны храниться в массиве размером 51.

Что я здесь не так делаю?

Попробуйте обнулить входную строку в atoi. Документация гласит, что atoi должен быть задан указатель на строку, который отличается от не завершенного одиночного символа. Ваши результаты с текущим кодом, который вы опубликовали, отличаются на разных платформах (я получаю -1 на unbuntu / gcc)

char fiftyNumbersOne[51] = "37107287533902102798797998220837590246510135740250";
int one = 0;
char aChar = fiftyNumbersOne[48];
char intChar[2];
printf("%c\n",aChar);//outputs 5 (second to last #)
sprintf(intChar, "%c", aChar); //print the char to a null terminated string
one = atoi(&intChar);
printf("%d\n",one);//outputs what appears to be INT_MAX...I want 5
0 голосов
/ 29 апреля 2011

Должен ли этот массив из 50 символов иметь размер 50 или 51 (для учета нулевого терминатора)?

51, но вы также можете объявить его без размера.

char foo[] = "foo";

Что я здесь не так делаю?

Не читал документацию по atoi Наверное.aChar - это char, поэтому вы передаете правильный тип atoi, но atoi ожидает, что этот тип будет представлять собой строку символов, обычно заканчивающуюся символом '\ 0'.Ваша «строка» не завершена.

Одно из решений этого -

char aString[2];
aString[0] = fiftyNumbersOne[48];
aString[1] = '\0';
atoi(aString);

Другое делает fiftyNumbersOne[48] - '0' вместо вызова atoi, поскольку в ASCII десятичные коды являются последовательнымии увеличивается от 0 до 9.

...