Wie überprüfe ich, ob eine Zeichenfolge eine Zahl ist?

Lesezeit: 5 Minuten

Ich möchte mit diesem Code überprüfen, ob eine Zeichenfolge eine Zahl ist. Ich muss überprüfen, ob alle Zeichen in der Zeichenfolge Integer sind, aber das While gibt immer isDigit = 1 zurück. Ich weiß nicht, warum das nicht funktioniert.

char tmp[16];
scanf("%s", tmp);

int isDigit = 0;
int j=0;
while(j<strlen(tmp) && isDigit == 0){
  if(tmp[j] > 57 && tmp[j] < 48)
    isDigit = 0;
  else
    isDigit = 1;
  j++;
}

  • Ihr Bereich ist falsch. Sie möchten größer als 57 und kleiner als 48 sein. Und es ist unmöglich

    – qwr

    20. Mai 2013 um 7:52 Uhr

  • Das scanf() Die Verwendung hier ist gefährlich, da die Eingabe überlaufen kann tmp Puffer.

    – jxh

    23. Juli 2015 um 0:25 Uhr

Benutzer-Avatar
Seele

Vergessen Sie ASCII-Code-Prüfungen, verwenden Sie isdigit oder isnumber (sehen man isnumber). Die erste Funktion prüft, ob das Zeichen 0–9 ist, die zweite akzeptiert je nach aktueller Locale auch verschiedene andere Zahlenzeichen.

Möglicherweise gibt es sogar bessere Funktionen, um die Überprüfung durchzuführen – die wichtige Lektion ist, dass dies etwas komplexer ist, als es aussieht, da die genaue Definition einer „Zahlenzeichenfolge“ von der jeweiligen Ländereinstellung und der Zeichenfolgencodierung abhängt.

  • +1. Vielleicht möchten sie auch darüber nachdenken - und . (je nach Standort natürlich)

    – Muh-Saft

    20. Mai 2013 um 7:54 Uhr

  • isdigit und isnumber sind sehr gute Funktionen. Sie sind jedoch wirklich schlecht, wenn Sie genau lernen möchten, wie man Zahlen von anderen Zeichen unterscheidet. Es ist wichtiger, die Grundlagen einer Funktion zu lernen, oder genauer gesagt, wie eine Funktion funktioniert, als zu lernen, wie man eine Funktion verwendet. Für mich ist diese Antwort richtig, hilft dem OP aber auf lange Sicht in keiner Weise. Er weiß immer noch nicht, wie man Zahlen in anderen Sprachen unterscheidet, die fehlen isdigit und isnumber. Nur meine 2 Cent.

    – Sani Singh Huttunen

    1. Juni 2013 um 0:49 Uhr


  if(tmp[j] >= '0' && tmp[j] <= '9') // should do the trick

Benutzer-Avatar
Dennis v

Offensichtlicheres und einfacheres Thread-sicheres Beispiel:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char **argv)
{
    if (argc < 2){
        printf ("Dont' forget to pass arguments!\n");
        return(-1);
    }

    printf ("You have executed the program : %s\n", argv[0]);

    for(int i = 1; i < argc; i++){
        if(strcmp(argv[i],"--some_definite_parameter") == 0){
            printf("You have passed some definite parameter as an argument. And it is \"%s\".\n",argv[i]);
        }
        else if(strspn(argv[i], "0123456789") == strlen(argv[i])) {
            size_t big_digit = 0;
            sscanf(argv[i], "%zu%*c",&big_digit);
            printf("Your %d'nd argument contains only digits, and it is a number \"%zu\".\n",i,big_digit);
        }
        else if(strspn(argv[i], "0123456789abcdefghijklmnopqrstuvwxyz./") == strlen(argv[i]))
        {
            printf("%s - this string might contain digits, small letters and path symbols. It could be used for passing a file name or a path, for example.\n",argv[i]);
        }
        else if(strspn(argv[i], "ABCDEFGHIJKLMNOPQRSTUVWXYZ") == strlen(argv[i]))
        {
            printf("The string \"%s\" contains only capital letters.\n",argv[i]);
        }
    }
}

  • Danke, @Gerhard. Sie haben Recht. Meine Schuld – Copy-Paste-Fehler.

    – Dennis v

    15. Oktober 2018 um 11:55 Uhr

  • Ich liebte diese Methode, numerische Zeichenfolgen zu identifizieren. Brillant!

    – Param Siddharth

    19. Mai 2020 um 18:54 Uhr


if ( strlen(str) == strlen( itoa(atoi(str)) ) ) {
    //its an integer
}

Da atoi Zeichenfolgen in Zahlen umwandelt, wobei andere Buchstaben als Ziffern übersprungen werden, muss die Zeichenfolgenlänge, wenn es keine anderen als Ziffern gibt, dieselbe sein wie die des Originals. Diese Lösung ist besser als innumber(), wenn die Prüfung auf Integer erfolgt.

Benutzer-Avatar
Marcelo

#include <stdio.h>
#include <string.h>
char isNumber(char *text)
{
    int j;
    j = strlen(text);
    while(j--)
    {
        if(text[j] > 47 && text[j] < 58)
            continue;

        return 0;
    }
    return 1;
}
int main(){
    char tmp[16];
    scanf("%s", tmp);

    if(isNumber(tmp))
        return printf("is a number\n");

    return printf("is not a number\n");
}

Sie können auch den String-Wert überprüfen, der auch mit Nicht-ASCII funktionieren könnte

char isNumber(char *text)
{
    int j;
    j = strlen(text);
    while(j--)
    {
        if(text[j] >= '0' && text[j] <= '9')
            continue;

        return 0;
    }
    return 1;
}

  • Es kann hilfreich sein, nach ‘\n’ und ‘\r’ zu suchen

    – Beobachter

    4. August 2021 um 17:12 Uhr


In diesem Teil Ihres Codes:

if(tmp[j] > 57 && tmp[j] < 48)
  isDigit = 0;
else
  isDigit = 1;

Dein if Bedingung wird immer falsch sein, was dazu führt isDigit immer eingestellt 1. Sie wollen wahrscheinlich:

if(tmp[j] > '9' || tmp[j] < '0')
  isDigit = 0;
else
  isDigit = 1;

Aber. dies kann vereinfacht werden zu:

isDigit = isdigit(tmp[j]);

Die Logik Ihrer Schleife scheint jedoch etwas fehlgeleitet zu sein:

int isDigit = 0;
int j=0;
while(j<strlen(tmp) && isDigit == 0){
  isDigit = isdigit(tmp[j]);
  j++;
}

Wie tmp keine Konstante ist, ist es ungewiss, ob der Compiler die Längenberechnung aus jeder Iteration optimieren wird.

Wie @andlrc in einem Kommentar vorschlägt, können Sie stattdessen einfach nach Ziffern suchen, da die abschließende NUL die Prüfung sowieso nicht bestehen wird.

while (isdigit(tmp[j])) ++j;

  • Es kann hilfreich sein, nach ‘\n’ und ‘\r’ zu suchen

    – Beobachter

    4. August 2021 um 17:12 Uhr


Benutzer-Avatar
Gsamaras

Ich muss dasselbe für ein Projekt tun, an dem ich gerade arbeite. So habe ich die Dinge gelöst:

/* Prompt user for input */
printf("Enter a number: ");

/* Read user input */
char input[255]; //Of course, you can choose a different input size
fgets(input, sizeof(input), stdin);

/* Strip trailing newline */
size_t ln = strlen(input) - 1;
if( input[ln] == '\n' ) input[ln] = '\0';

/* Ensure that input is a number */
for( size_t i = 0; i < ln; i++){
    if( !isdigit(input[i]) ){
        fprintf(stderr, "%c is not a number. Try again.\n", input[i]);
        getInput(); //Assuming this is the name of the function you are using
        return;
    }
}

1344550cookie-checkWie überprüfe ich, ob eine Zeichenfolge eine Zahl ist?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy