C sortie des positions variables (pointeurs) au lieu des valeurs réelles

Je travaillais sur un projet de classe et je voulais faire un peu plus et valider mes données. Le problème semble se produire à num1 = num1Input (et num2 = num2Input ) où il obtient l’emplacement (je suppose) au lieu de la valeur d’entrée réelle.

 int main(void) { //variables char num1input[10]; char num2input[10]; int length, i; int num1 = 0; int num2 = 0; int countErrors1 = 0; int countErrors2 = 0; bool correct1 = false; bool correct2 = false; //--end of variable declarations--// do { printf("Please enter a number: "); scanf("%s", num1input); length = strlen(num1input); for (i = 0; i  0) { printf("Input is not a number \n"); } else { correct1 = true; } } while (correct1 == false); num1 = num1input; do { printf("Please enter second number: "); scanf("%s", num2input); length = strlen(num2input); for (i = 0; i  0) { printf("Input is not a number \n"); } else { correct2 = true; } } while (correct2 == false); num2 = (int)num2input; printf("%d %d \n", num1, num2); int addition = num1 + num2; int substraction = num1 - num2; int multiplication = num1 * num2; float division = num1 / num2; printf("Addition: %d Subtraction: %d Multiplication: %d Division: %.1e", addition, substraction, multiplication, division); getch(); } 

Vous ne pouvez pas convertir une chaîne en un nombre avec une num1 = num1input; telle que num1 = num1input; . Vous devez appeler une fonction de bibliothèque à partir de :

 #include  ... num1 = atoi(num1input); 

Mais atoi ignore les erreurs d’parsing. Pour vous assurer que les débordements sont détectés, vous pouvez utiliser strtol() comme suit:

 #include  #include  #include  ... errno = 0; char *endp; long lval = strtol(num1input, &endp, 10); if (endp == num1input || errno != 0 || lval < INT_MIN || lval > INT_MAX) { /* parse error detected: * you could print an error message. */ if (lval < INT_MIN) lval = INT_MIN; /* clamp lval as an int value. */ if (lval > INT_MAX) lval = INT_MAX; } num1 = lval; 

Ou si vous souhaitez reconnaître une syntaxe hexadécimale telle que 0x10 :

 num1 = strtol(num1input, NULL, 0); 

La même chose est applicable pour num2input .

Notez que isdigit(num1input[i]) est potentiellement incorrect si char est signé et que num1input[i] a une valeur négative. Vous devriez écrire:

 isdigit((unsigned char)num1input[i]) 

Notez également que float division = num1 / num2; calculera la division entière et convertira le résultat en float . Si vous voulez la division en virgule flottante, vous devez écrire:

 float division = (float)num1 / num2; 

Notez enfin qu’il est recommandé d’utiliser double au lieu de float pour une meilleure précision.

Voici une version corrigée et simplifiée:

 #include  #include  #include  #include  /* simple implementation of strtoi(), inspired by elegant code from chux */ int strtoi(const char *s, char **endptr, int base) { long y = strtol(s, endptr, base); #if INT_MAX != LONG_MAX if (y > INT_MAX) { errno = ERANGE; return INT_MAX; } #endif #if INT_MIN != LONG_MIN if (y < INT_MIN) { errno = ERANGE; return INT_MIN; } #endif return (int)y; } int main(void) { char num1input[20]; char num2input[20]; char *endp; int num1, num2; for (;;) { printf("Please enter a number: "); if (scanf("%19s", num1input) != 1) return 1; errno = 0; num1 = strtoi(num1input, &endp, 10); if (errno == 0 && *endp == '\0') break; printf("Input is not a number\n"); } for (;;) { printf("Please enter a second number: "); if (scanf("%19s", num2input) != 1) return 1; errno = 0; num2 = strtoi(num2input, &endp, 10); if (errno == 0 && *endp == '\0') break; printf("Input is not a number\n"); } printf("%d %d\n", num1, num2); int addition = num1 + num2; int subtraction = num1 - num2; int multiplication = num1 * num2; double division = (double)num1 / num2; printf("Addition: %d Subtraction: %d Multiplication: %d Division: %g\n", addition, subtraction, multiplication, division); getch(); }