Converte uma string para int (Mas só se realmente é um int)
-
19-09-2019 - |
Pergunta
Na faculdade eu estava perguntou se nossos detecta programa se a cadeia de entrar de argumentos de linha de comando é um número inteiro que isso não aconteceu (./Program 3.7
). Agora eu estou querendo saber como posso detectar isso. Então entrada como por exemplo a
é inválido que detecta atoi, mas de entrada como, por exemplo 3.6
deve ser inválida, mas atoi irá converter isso em um inteiro.
#include <stdio.h>
int main(int argc, char *argv[]) {
if (argc > 1) {
int number = atoi(argv[1]);
printf("okay\n");
}
}
Mas offcourse bem só deve ser impresso se argv [1] é realmente um inteiro. Espero que a minha pergunta é clara. Muito obrigado.
Solução
Tenha um olhar em strtol .
Se endptr não é NULL, strtol () armazena o endereço do primeiro caractere inválido no * endptr. Se não houvesse dígitos em tudo, no entanto, strtol () armazena o valor original de str em * endptr. (Assim, se * str não é
\0' but **endptr is
\ 0' no retorno, toda a cadeia era válido.)
#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");
}
}
Outras dicas
Assumindo que você quer saber como isso poderia ser feito em código (possível se ele é de fato a lição de casa), é uma maneira de pensar sobre o que constitui um número inteiro em termos de string. Ele provavelmente seria:
- um sinal opcional, +/-.
- um dígito necessário.
- qualquer número de dígitos opcionais (mas cuidado com overflow).
- o fim da string.
Desde que a especificação, você pode escrever uma função que irá fazer o trabalho para você.
Algo como este pseudo-código seria um bom começo:
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.
Então, sua melhor escolha é 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 );
}
EDIT: permitir - e + caracteres
Você pode até comprimir isso em uma densa um ou dois forro. Ou você pode encontrar uma função de biblioteca com a mesma funcionalidade;)
EDIT2: just for fun - deve agora analisar o número