atoi() возвращает странное значение

Я получаю очень странное поведение от команды atoi. Я пытаюсь найти 2 значения вне диапазона в формате [1:2]. Создаваемая строка выполняется с помощью макроса динамического выделения строки (если Sasprintf выдает вас). Однако она будет прочитана из файла в конце проекта. . Во всяком случае, я, кажется, правильно разбираю свою строку, учитывая правильные значения token и token2. Однако я сбит с толку, почему звонок atoi по телефону token2 дал бы мне тарабарщину в ответ. Кроме того, среди всего этого я узнал, что strtok устарел, я просто еще не удосужился его переключить, пока не решу эту ошибку.

char *token;
char *token2;

int lsb = 0;
int msb = 0;    
char *str = NULL;

Sasprintf(str,"[4:0]");

token = strtok(str,"[");
if(token != NULL)
{
    token = strtok(token,":");
    msb = atoi(token);
    printf("%d\n", msb);
    token2 = strtok(NULL,"]");
    puts(token2);

    lsb = atoi(token2);
    printf("%d\n",token2);
}

ВЫХОД

4

0

19853443


person kennedyl    schedule 09.07.2015    source источник
comment
strtok is deprecated...как?   -  person Sourav Ghosh    schedule 10.07.2015
comment
Я предполагаю, потому что он не реентерабельный   -  person Sean Bright    schedule 10.07.2015
comment
printf("%d\n",token2); должно быть printf("%d\n", lsb);, не так ли? В противном случае вы печатаете целочисленное представление указателя.   -  person Paul Roub    schedule 10.07.2015
comment
С каких пор strtok устарело?   -  person haccks    schedule 10.07.2015
comment
Это нормально для простых программ, но вызывает проблемы параллелизма в многопоточных приложениях. Лучше всего использовать strtok_s   -  person kennedyl    schedule 10.07.2015
comment
Пол был прав... действительно глупая ошибка. Спасибо, что избавили меня от головной боли. Думаю, мне, возможно, придется немного отойти от компьютера!   -  person kennedyl    schedule 10.07.2015
comment
@SouravGhosh @hackcks man strtok =› This interface is obsoleted by strsep(3).   -  person r3mainer    schedule 10.07.2015
comment
@SouravGhosh, я только что выполнил поиск в Интернете функции strtok(), используемой в C, и не нашел никаких ссылок, указывающих на то, что эта функция устарела или заменена на strsep(). Разместите ссылку с этой информацией   -  person user3629249    schedule 12.07.2015


Ответы (2)


Я думаю, вам нужно изменить

  printf("%d\n",token2);

to

  printf("%d\n",lsb);

token2 — это char *, и вы не можете напечатать его, используя %d. Вызывает неопределенное поведение

Тем не менее, всегда проверяйте возвращаемое значение strtok() на NULL. Кроме того, strtod() является лучшей альтернативой atoi().

person Sourav Ghosh    schedule 09.07.2015
comment
Да, действительно глупая ошибка. Искал что-то поведенческое, а вместо этого я просто тупой! Спасибо - person kennedyl; 10.07.2015

    printf("%d\n",token2);

Это не то, как вы печатаете строку, используйте:

    printf("%s\n",token2);

or

    printf("%d\n", lsb);

чтобы распечатать результат вашего преобразования.

person ouah    schedule 09.07.2015