C generando posiciones de variables (punteros) en lugar de valores reales

Estaba trabajando en un proyecto de clase y quería hacer un poco más y validar mis datos. El problema parece ocurrir en num1 = num1Input (y num2 = num2Input ) donde obtiene la ubicación (supongo) en lugar del valor de entrada real

 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(); } 

No puede convertir una cadena en un número con una conversión tal como num1 = num1input; . Debe llamar a una función de biblioteca desde :

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

Pero atoi ignora los errores de análisis. Para asegurarse de que se detecten desbordamientos, puede usar strtol() siguiente manera:

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

O si quieres reconocer una syntax hexadecimal como 0x10 :

 num1 = strtol(num1input, NULL, 0); 

Lo mismo es aplicable para num2input .

Tenga en cuenta que isdigit(num1input[i]) es potencialmente incorrecto si char está firmado y num1input[i] tiene un valor negativo. Deberías escribir:

 isdigit((unsigned char)num1input[i]) 

También tenga en cuenta que la float division = num1 / num2; calculará la división entera y convertirá el resultado en un float . Si quieres la división de punto flotante, debes escribir:

 float division = (float)num1 / num2; 

Tenga en cuenta finalmente que se recomienda usar double lugar de float para una mejor precisión.

Aquí hay una versión corregida y simplificada:

 #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(); }