Pregunta

En la universidad me preguntaron si el programa detecta si la cadena de entrar en los argumentos de línea de comandos es un número entero que no lo hizo (./Program 3.7). Ahora me pregunto cómo puedo detectar esto. Por lo tanto de entrada como por ejemplo a no es válido el que Atoi detecta, pero de entrada como por ejemplo 3.6 debe ser válido, pero atoi convierten estos datos en un número entero.

#include <stdio.h>

int main(int argc, char *argv[]) {
    if (argc > 1) {
        int number = atoi(argv[1]);
        printf("okay\n");
    }
}

Pero offcourse bien solamente se imprimirán si argv [1] es realmente un entero. Espero que mi pregunta sea clara. Muchas gracias.

¿Fue útil?

Solución

Tener un vistazo a strtol .

  

Si endptr no es NULL, strtol () almacena la dirección del primer carácter no válido en * endptr. Si no hubiera dígitos en absoluto, sin embargo, strtol () almacena el valor original de str en endptr *. (Por lo tanto, si no se * str \0' but **endptr is \ 0' a la vuelta, la cadena entera era válida.)

#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");
  }
}

Otros consejos

Suponiendo que usted quiere saber cómo se podría hacer en el código (es posible si es de hecho la tarea), una forma es pensar en lo que constituye un número entero en términos de la cadena. Sería más probable es que:

  • un signo opcional, +/-.
  • un dígito requerido.
  • cualquier número de dígitos opcionales (pero cuidado con desbordamiento).
  • al final de la cadena.

A partir de esa especificación, se puede escribir una función que hará el trabajo por usted.

Algo como esto pseudo-código sería un buen comienzo:

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.
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 );
}

EDITAR: permite - y + caracteres

Usted puede incluso comprimir esto en una densa uno o dos forro. O usted puede encontrar una función de biblioteca con la misma funcionalidad;)

Edit2: sólo por diversión - debe ahora analizar el número

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top