2014-02-04 2 views
-3

Я пытаюсь использовать atoi для преобразования строки в int, а затем проверить, действительно ли строка была целыми.Использование atoi для проверки строки

Вот мой код:

printf("Please input the port: "); 
scanf("%s",port_number); 
int i = atoi(port_number); 
if(i != port_number) 
{ 
    errno = ERR_INVALID_PARAM;     
    printf("Error invalid port number\n"); 
} 

Однако, даже если моя строка «port_number» является целым числом, оно все еще идет в, если заявлении? Любая помощь?

+1

Вы пытаетесь сравнить целое число и строку ... –

+1

Вы не можете сравнивать число и строку таким образом. Посмотрите здесь http://stackoverflow.com/questions/3850558/how-to-check-to-ensure-you-have-an-integer-before-calling-atoi – fede1024

+0

Ваш пример не заполнен. Нам, по крайней мере, не хватает определения 'port_number'. – glglgl

ответ

1

Я предполагаю, что port_number имеет тип char *.

Оператор if, который у вас есть, сравнивает адрес строки port_number C со значением i, и я не думаю, что это то, что вы хотите сделать.

Если вы хотите использовать ctype.h, то вы можете использовать функцию isdigit() для проверки каждого элемента port_number. В противном случае, следующая лучшая вещь состоит в том, чтобы цикл через port_number и выяснить, есть ли каждый элемент между ascii char '0' и '9', чтобы убедиться, что номер порта введен правильно.

+0

Если 'port_number' имеет тип' char * ', то сравнение' i! = Port_number' не должно даже компилироваться. По крайней мере, должно быть предупреждение. (gcc просто предупреждает об этом по умолчанию.) –

0

Подумайте о том, что вы сравниваете там:

if(i != port_number) 
{ 
    //code 
} 

я имею типа Int и PORT_NUMBER это символ *.

+0

'port_number' является указателем на char. – fede1024

+0

@ fede1024 избили меня :) – gmorrow

2

Вам необходимо выполнить некоторую проверку ошибок на входящей строке, прежде чем преобразовать ее в int. Вы можете попробовать функцию strtol(). Он проверяет, может ли строка быть преобразована в длинный int. Он возвращает либо преобразованное значение, либо ноль, если строка не может быть преобразована.

второй аргумент strtol() является символом **. После завершения функции она указывает на первый символ в строке, которая НЕ является символом юридического номера. Поэтому, если он указывает куда угодно до конца строки, то преобразование не удалось.

http://www.tutorialspoint.com/c_standard_library/c_function_strtol.htm

0
char *check = strdup(port_number); 
sprintf(check, "%i", i); 
if(strcmp(check, port_number))