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++;
}
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.
if(tmp[j] >= '0' && tmp[j] <= '9') // should do the trick
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++;
}
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;
}
}
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]);
}
}
}
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)