it-swarm.com.de

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

Ich möchte überprüfen, ob eine Zeichenfolge eine Zahl mit diesem Code ist. Ich muss überprüfen, ob alle Zeichen in der Zeichenfolge ganzzahlig sind, aber die while-Werte sind immer digit = 1. Ich weiß nicht, warum das funktioniert, wenn es 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++;
}
14
Astinog

Vergessen Sie die Überprüfung des ASCII -Codes, verwenden Sie isdigit oder isnumber (siehe man isnumber ). Die erste Funktion prüft, ob das Zeichen 0–9 ist, die zweite akzeptiert je nach aktuellem Gebietsschema auch verschiedene andere Zeichen.

Es kann sogar bessere Funktionen für die Überprüfung geben - die wichtige Lektion ist, dass dies etwas komplexer ist, als es aussieht, da die genaue Definition einer "Zahlenzeichenfolge" vom jeweiligen Gebietsschema und der Zeichenfolgencodierung abhängt.

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

In diesem Teil Ihres Codes:

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

Ihre if-Bedingung ist immer falsch, sodass isDigit immer auf 1 gesetzt ist. 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 erscheint jedoch irgendwie fehlgeleitet:

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

Sie sollten aus der Schleife aussteigen, sobald Sie eine Nicht-Ziffer erkennen. Die while-Logik sollte also geändert werden:

while(j<strlen(tmp)){
  isDigit = isdigit(tmp[j]);
  if (isDigit == 0) break;
  j++;
}
3
jxh

Ich muss dasselbe für ein Projekt tun, an dem ich gerade arbeite. So habe ich 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;
    }
}
2
Mitchell Griest

Ein offensichtlicheres und einfaches, 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]);
        }
    }
}
2
Dennis V.R.

Ihre Bedingung sagt if X is greater than 57 AND smaller than 48. X kann nicht gleichzeitig größer als 57 und kleiner als 48 sein.

if(tmp[j] > 57 && tmp[j] < 48)

Es sollte if X is greater than 57 OR smaller than 48 sein:

if(tmp[j] > 57 || tmp[j] < 48)
0