C输出变量位置(指针)而不是实际值。

16 浏览
0 Comments

C输出变量位置(指针)而不是实际值。

我正在进行一个班级项目,我想多做一点,对我的数据进行验证。问题似乎发生在num1 = num1Input(以及num2 = num2Input)的地方,它获取的是位置(我猜是这样),而不是实际的输入值。

#include 
#include 
#include 
#include 
#include 
int main(void) {
    //变量
    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;
    //--变量声明结束--//
    do {
        printf("请输入一个数字:");
        scanf("%s", num1input);
        length = strlen(num1input);
        for (i = 0; i < length; i++) {
            if (!isdigit(num1input[i])) {
                countErrors1++;
            }
        }
        if (countErrors1 > 0) {
            printf("输入不是一个数字\n");
        } else {
            correct1 = true;
        }
    } while (correct1 == false);
    num1 = atoi(num1input);
    do {
        printf("请输入第二个数字:");
        scanf("%s", num2input);
        length = strlen(num2input);
        for (i = 0; i < length; i++) {
            if (!isdigit(num2input[i])) {
                countErrors2++;
            }
        }
        if (countErrors2 > 0) {
            printf("输入不是一个数字\n");
        } else {
            correct2 = true;
        }
    } while (correct2 == false);
    num2 = atoi(num2input);
    printf("%d %d \n", num1, num2);
    int addition = num1 + num2;
    int substraction = num1 - num2;
    int multiplication = num1 * num2;
    float division = (float)num1 / num2;
    printf("加法:%d 减法:%d 乘法:%d 除法:%.1e", addition, substraction, multiplication, division);
    getch();
}

0
0 Comments

问题的原因是在将字符串转换为数字时,使用了不正确的类型转换。通过使用atoi函数进行转换,可以解决这个问题。然而,atoi函数忽略了解析错误。为了确保检测到溢出,可以使用strtol函数。另外,如果想要识别十六进制语法,可以使用strtol函数。另外,还需要注意的是,当char为有符号类型并且num1input[i]具有负值时,isdigit(num1input[i])可能不正确。在进行浮点数除法时,需要注意使用float division = (float)num1 / num2;来计算浮点数除法。另外,建议使用double而不是float来获得更好的精度。最后,给出了一个修正和简化的版本的代码示例。

代码示例中给出的解决方法是使用strtol函数来将字符串转换为数字,并进行溢出检测。具体的解决方法如下:

1. 引入头文件:#include <stdlib.h>

2. 定义变量:char *endp;

3. 使用strtol函数将字符串转换为long类型的数字:long lval = strtol(num1input, &endp, 10);

4. 检查是否发生了解析错误:if (endp == num1input || errno != 0 || lval < INT_MIN || lval > INT_MAX)

5. 如果发生了解析错误,可以打印错误信息或者进行其他处理。

6. 将lval转换为int类型的数字:num1 = lval;

同样的方法也适用于num2input

最后,给出了一个修正和简化的版本的代码示例,包括了上述的解决方法。

0