Как преобразовать часть строки в int в C?

У меня есть строка кода следующим образом,

char conv[20]="score: 34";

Я хочу извлечь число (34) внутри строки 'conv' и преобразовать его в целое число. Я использовал функцию "Атои". Но это дает 0 в результате.

printf("score: %d\n",atoi(conv)); //this prints 'score: 0'

Может ли кто-нибудь помочь мне преобразовать число внутри этой строки в целое число?

2 ответа

atoi() вернусь 0 если преобразование не может быть выполнено. Посмотри здесь

Строка "score: 34" не может быть преобразован в действительный int, Так atoi() возвращается 0,

Если после 34 в вашей строке, вы могли бы сделать

printf("score: %d\n",atoi(conv + 7));

Это дало бы 34, conv + 7 указывает на строку "34", Это эквивалентно conv + strlen("score: "),

Использование strtol() вместо atoi() может быть лучше здесь.

Вы можете найти, что именно пошло не так легче с strtol(),

Вы можете использовать это как

long rv=strtol(conv, &ptr, 10);

где ptr имеет тип char * или просто

rv=strtol(conv, NULL, 10);

Если conv является "score: 34" Вот, 0 возвращается и ptr укажет на начало conv,

Обратите внимание, что strtol() возвращает long и не int,

Если диапазон int меньше, чем у long, вы можете проверить, является ли возвращаемое значение больше самого большого int который INT_MAX для подписанных Int. INT_MAX в limits.h,

Если переполнение произошло из-за того, что число в строке слишком велико для представления в long, errno будет установлен в ERANGE (Оно в errno.h).

long rv=strtol(str, NULL, 10);
if(rv>INT_MAX || rv<INT_MIN || errno==ERANGE)
{
    perror("something is wrong.");
}

Вы пытаетесь использовать atoi который согласно документации гласит:

Если первая последовательность непробельных символов в str не является допустимым целым числом или если такой последовательности не существует, поскольку либо str пуста, либо содержит только пробельные символы, преобразование не выполняется и возвращается ноль.

Итак, как вы понимаете, ваш код имеет неправильное преобразование.

Вот несколько примеров кодов, которые будут работать:

  1. Правильное использование atoi:

    char conv[20]="34";
    printf("score: %d\n",atoi(conv)); //this prints 'score: 34'
    
  2. С помощью strpbrk:

    char conv[20]="score: 34";
    char breakset[] = "0123456789";
    printf("score: %d\n",atoi(strpbrk(conv, breakset))); //this prints 'score: 34'
    
Другие вопросы по тегам