web-dev-qa-db-fra.com

Comment vérifier si une chaîne est un nombre?

Je veux vérifier si une chaîne est un nombre avec ce code. Je dois vérifier que tous les caractères de la chaîne sont des entiers, mais le retour de while est toujours isDigit = 1. Je ne sais pas pourquoi cela si ne fonctionne pas.

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

Oubliez les vérifications de code ASCII, utilisez isdigit ou isnumber (voir man isnumber ). La première fonction vérifie si le caractère est compris entre 0 et 9, la seconde accepte également divers autres caractères numériques, en fonction de la localisation.

Il peut même y avoir de meilleures fonctions pour effectuer la vérification - la leçon importante à retenir est que ceci est un peu plus complexe qu'il n'y paraît, car la définition précise d'une «chaîne numérique» dépend des paramètres régionaux et du codage de la chaîne.

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

Dans cette partie de votre code:

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

Votre condition if sera toujours fausse, ce qui aura pour effet que isDigit sera toujours défini sur 1. Vous voulez probablement:

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

Mais. ceci peut être simplifié pour:

isDigit = isdigit(tmp[j]);

Cependant, la logique de votre boucle semble un peu erronée:

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

Vous devriez avoir envie de sortir de la boucle dès que vous détectez un non-chiffre. Donc, la logique while devrait être changée:

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

Je dois faire la même chose pour un projet sur lequel je travaille actuellement. Voici comment j'ai résolu les choses:

/* 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

Exemple plus simple et évident, thread-safe:

#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.

Votre condition dit if X is greater than 57 AND smaller than 48. X ne peut pas être supérieur à 57 et inférieur à 48 en même temps.

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

Ce devrait être if X is greater than 57 OR smaller than 48:

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