Хорошо, мой пересмотренный ответ. sscanf вел себя не так, как я думал, а strtol предоставляет лучшее решение, похожее на C, которое очень портативно.
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
for (int i=1; i < argc; i++){
char* end;
long val = strtol(argv[i], &end, 10);
if (argc >= 2 && !end[0] && val >= 0){
printf("%s is valid\n", argv[i]);
} else {
printf("%s is invalid\n", argv[i]);
}
}
return 0;
}
Пример вывода: ./a.out 10 -1 32 1000 f -12347 +4 --10 10мусор
10 is valid
-1 is valid
32 is valid
1000 is valid
f is invalid
-12347 is valid
+4 is invalid
--10 is invalid
10rubbish is invalid
Это работает, потому что strtol преобразует аргумент в длинное целое число. Затем, если end[0] не находится в конце строки, он будет ненулевым, что означает, что он выдаст ошибку для 10rubbish, но будет в порядке для таких значений, как 10. Тогда, конечно, нам нужны только положительные целые числа, и я включил значение 0 в этот набор.
atoi() сама по себе недостаточно хороша, так как возвращает ноль в случае ошибки. 0 может быть допустимым вводом.
sscanf() сам по себе тоже недостаточно хорош, потому что он успешно преобразует такие строки, как 10rubbish, и возвращает значение 10.
Я понимаю, что op хочет только argv[1], этот ответ сканирует все предоставленные аргументы, чтобы показать вывод множества действительных и недействительных записей.
person
hookenz
schedule
22.04.2013
atoi
недостаточно сложен, чтобы дать здесь правильный ответ. Посмотрите наstrtol
. - person Pete Becker   schedule 23.04.2013argc
, прежде чем вы даже подумаете о проверкеargv[1]
. Подумайте, что произойдет, если вы запустите программу без аргументов. И вам не хватает как минимум пары обязательных директив#include
. - person Keith Thompson   schedule 23.04.2013