Frage

Im College wurde ich gefragt, ob unser Programm erkennt, wenn die Zeichenfolge von Befehlszeilenargumenten eingeben ist eine ganze Zahl, die es nicht (./Program 3.7) tat. Jetzt frage ich mich, wie ich das erkennen kann. So Eingang wie zum Beispiel a ist ungültig, der erkennt, atoi, aber Eingang wie zum Beispiel 3.6 ungültig sein sollte, aber atoi wird diese in einer ganzen Zahl konvertieren.

#include <stdio.h>

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

Aber offcourse Ordnung sollte nur gedruckt werden, wenn argv [1] wirklich eine ganze Zahl ist. Hoffe, dass meine Frage klar. Vielen Dank.

War es hilfreich?

Lösung

Hier finden Sie aktuelle strtol .

  

Wenn endptr nicht NULL ist, strtol () speichert die Adresse der ersten ungültigen Zeichen in * endptr. Wenn es überhaupt keine Ziffern waren jedoch strtol () speichert den ursprünglichen Wert von str in * endptr. (Wenn also * str \0' but **endptr is \ nicht 0' auf Rückkehr, die gesamte Zeichenfolge gültig war.)

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

Andere Tipps

Angenommen, Sie wollen wissen, wie es im Code getan werden könnte (möglich, wenn es sich tatsächlich um Hausaufgaben), ist eine Möglichkeit, darüber nachzudenken, was in Bezug auf die Zeichenfolge eine ganze Zahl darstellt. Es wäre höchstwahrscheinlich sein:

  • ein optionales Vorzeichen, +/-.
  • eine gewünschte Ziffer.
  • eine beliebige Anzahl von optionalen Ziffern (aber achten Sie auf Überlauf).
  • das Ende der Zeichenfolge.

Von dieser Spezifikation können Sie eine Funktion schreiben, die die Arbeit für Sie tun wird.

So etwas wie dieser Pseudo-Code wäre ein guter Anfang sein:

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

EDIT: allow - und + Zeichen

Sie können auch diese in einen dichten Ein- oder Zwei Liner komprimieren. Oder Sie können eine Bibliotheksfunktion mit der gleichen Funktionalität finden;)

EDIT2: nur zum Spaß - es soll jetzt die Anzahl

analysiert
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top