Преобразовать строку в int (но только если это действительно int)
-
19-09-2019 - |
Вопрос
В колледже меня спросили, определяет ли наша программа, является ли строка, введенная из аргументов командной строки, целым числом, чего она не сделала(./Program 3.7
).Теперь мне интересно, как я могу это обнаружить.Итак, введите, как например a
недопустимо, что обнаруживает atoi, но вводите, как, например 3.6
должно быть недопустимым, но atoi преобразует его в целое число.
#include <stdio.h>
int main(int argc, char *argv[]) {
if (argc > 1) {
int number = atoi(argv[1]);
printf("okay\n");
}
}
Но, конечно, «ОК» следует печатать только в том случае, если argv[1] действительно является целым числом.Надеюсь, мой вопрос ясен.Большое спасибо.
Решение
Посмотри на стртол.
Если значение endptr не NULL, функция strtol() сохраняет адрес первого недопустимого символа в *endptr.Однако если цифр вообще не было, strtol() сохраняет исходное значение str в *endptr.(Таким образом, если *str не
\0' but **endptr is
\0' при возврате вся строка действительна.)
#include <stdio.h>
int main(int argc, char *argv[]) {
if (argc > 1) {
char* end;
long number = strtol(argv[1], &end, 0);
if (*end == '\0')
printf("okay\n");
}
}
Другие советы
Предполагая, что вы хотите знать, как это можно сделать в коде (возможно, если это действительно домашнее задание), один из способов — подумать о том, что представляет собой целое число с точки зрения строки.Скорее всего, это будет:
- необязательный знак +/-.
- необходимая цифра.
- любое количество необязательных цифр (но следите за переполнением).
- конец строки.
На основании этой спецификации вы можете написать функцию, которая сделает всю работу за вас.
Хорошим началом было бы что-то вроде этого псевдокода:
set sign to +1.
set gotdigit to false.
set accumulator to 0.
set index to 0.
if char[index] is '+':
set index to index + 1.
else:
if char[index] is '-':
set sign to -1.
set index to index + 1.
while char[index] not end-of-string:
if char[index] not numeric:
return error.
set accumulator to accumulator * 10 + numeric value of char[index].
catch overflow here and return error.
set index to index + 1.
set gotdigit to true.
if not gotdigit:
return error.
return sign * accumulator.
Поэтому ваш лучший выбор strtof()
http://publib.boulder.ibm.com/infocenter/zos/v1r10/topic/com.ibm.zos.r10.bpxbd00/strtof.htm
int okay = argc>1 && *argv[1];
char* p = argv[1];
int sign = 1;
int value = 0;
if( *p=='-' ) p++, sign=-1;
else if( *p=='+' ) p++;
for( ; *p; p++ ) {
if( *p>='0' && *p<='9' ) {
value = 10*value + *p-'0';
} else {
okay = 0;
break;
}
}
if( okay ) {
value *= sign;
printf( "okay, value=%d\n", value );
}
РЕДАКТИРОВАТЬ:разрешить символы - и +
Вы можете даже сжать это в плотный однострочный или двухстрочный текст.Или вы можете найти библиотечную функцию с той же функциональностью;)
РЕДАКТИРОВАТЬ2:просто ради интереса — теперь он должен проанализировать число