Как преобразовать часть строки в 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 пуста, либо содержит только пробельные символы, преобразование не выполняется и возвращается ноль.
Итак, как вы понимаете, ваш код имеет неправильное преобразование.
Вот несколько примеров кодов, которые будут работать:
Правильное использование
atoi
:char conv[20]="34"; printf("score: %d\n",atoi(conv)); //this prints 'score: 34'
С помощью
strpbrk
:char conv[20]="score: 34"; char breakset[] = "0123456789"; printf("score: %d\n",atoi(strpbrk(conv, breakset))); //this prints 'score: 34'