LINUX.ORG.RU

C: char* -> int check


0

0

itoa() и strtol() при конвертации не возвращают ошибку, что в строке содержатся символы, которые не могут быть преобразованы. Есть ли стандартные (glibc/POSIX functions) средства для проверки, что ВСЕ символы в некотором char* buf, переданные в itoa() будут использованы для конвертации? Иначе, вернуть error value.

Спасибо.

P.S. Нужно проверять, что переданный массив символов является числом. Regexp'ы и "проходы циклом" не подходят.

anonymous


int convert(char *str)
{
int num;
if(*str!='0')sscanf(str,"%d",&num);
else if(str[1]!='x')sscanf(str+1,"%o",&num);
else sscanf(str+2,"%x",&num);
return num;
}

int main ()
{
char str[10];
int a = 512;
sprintf(str, "%9d", a);
printf("%s\n", str);
int adf = convert("adsf1ff23sdf");
printf("%d\n", adf);

return 0;
}


выводит 0

kto_tama ★★★★★
()

а как ты без просмотра всех символов и "прохода циклом" узнаешь является ли он числом? это тебе к программе придется писать модуль связи с астралом

Reset ★★★★★
()
Ответ на: комментарий от Reset

Вообще-то можно всё сделать именно с помощью strtol:

const char * pstart = "135";
char * pend;
long l;

errno = 0;

l = ::strtol (pstart, &pend, 10);

if (pend == pstart || *pend ! '\0')
{
/* строка не содержит число или содержит другие
символы кроме числовых */
}

if (errno == ERANGE)
{
/* число не помещается в тип long */;
}

romanSA
()
Ответ на: комментарий от romanSA

Извиняюсь за опечатку, должно быть:

if (pend == pstart || *pend != '\0')

romanSA
()

за itoa - убью на месте (см википедию)
а strtol возвращает указатель на первый не распарсеный символ (man strtol)

generatorglukoff ★★
()

Невнимательно прочитал man к strtol. Вопрос снят. Спасибо всем за помощь.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.