You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

scanf_s无法向结构体赋值?二维向量相加程序异常求助

问题分析:二维向量相加程序输出始终为0的原因

你的代码核心问题是数组arr存储的是vec1和vec2的副本,而非对原变量的引用,修改数组元素不会同步到原变量上,导致后续计算时传入的vec1和vec2始终是未初始化的默认值(通常为0)。

具体原因拆解

当你执行vec_2d arr[] = {vec1, vec2};时,程序会创建一个新的数组,将vec1和vec2当前的(未初始化的)值复制到数组的两个元素中。后续循环里你修改的是arr[i].x_coord和arr[i].y_coord——这些修改只作用于数组内的副本,和原来的vec1、vec2没有任何关系。因此在调用add_vectors(vec1, vec2)时,传入的还是未被赋值的原始变量,最终输出自然全是0。

两种修复方案

方案一:直接操作原变量(无需数组)

去掉数组,直接给vec1和vec2赋值,逻辑更直观:

if (choice == 1) {
    vec_2d vec1, vec2;
    // 直接输入vec1的值
    printf("Enter values for vector 1\n");
    printf("Enter x_coord for vector 1: ");
    scanf_s("%f", &vec1.x_coord);
    printf("Enter y_coord for vector 1: ");
    scanf_s("%f", &vec1.y_coord);

    // 直接输入vec2的值
    printf("Enter values for vector 2\n");
    printf("Enter x_coord for vector 2: ");
    scanf_s("%f", &vec2.x_coord);
    printf("Enter y_coord for vector 2: ");
    scanf_s("%f", &vec2.y_coord);

    // 后续打印和计算逻辑不变
    printf("\nAdding the 2 vectors...\nVec1 = %fi + %fj \t vec2 = %fi + %fj\n", vec1.x_coord, vec1.y_coord, vec2.x_coord, vec2.y_coord);
    vec_data final_vec = add_vectors(vec1, vec2);
    printf("Addition of 2 vectors = %fi + %fj\n", final_vec.x_coord, final_vec.y_coord);
    printf("Magnitude of final vector: %f\n", final_vec.magnitude);
}

方案二:用指针数组引用原变量(保留循环写法)

如果想继续用循环简化代码,可以用指针数组存储vec1和vec2的地址,这样修改数组元素时会直接作用于原变量:

if (choice == 1) {
    vec_2d vec1, vec2;
    // 定义指针数组,存储vec1和vec2的地址
    vec_2d *arr[] = {&vec1, &vec2};
    for(int i = 0; i<2; i++) {
        printf("Enter values for vector %d\n", i + 1);
        printf("Enter x_coord for vector %d: ", i + 1);
        // 通过指针修改原变量的x坐标
        scanf_s("%f", &arr[i]->x_coord);
        printf("Enter y_coord for vector %d: ", i + 1);
        // 通过指针修改原变量的y坐标
        scanf_s("%f", &arr[i]->y_coord);
    }
    // 后续打印和计算逻辑不变
    printf("\nAdding the 2 vectors...\nVec1 = %fi + %fj \t vec2 = %fi + %fj\n", vec1.x_coord, vec1.y_coord, vec2.x_coord, vec2.y_coord);
    vec_data final_vec = add_vectors(vec1, vec2);
    printf("Addition of 2 vectors = %fi + %fj\n", final_vec.x_coord, final_vec.y_coord);
    printf("Magnitude of final vector: %f\n", final_vec.magnitude);
}

你提到之前单独写这段代码正常,大概率是因为之前的代码没有使用数组副本,而是直接对vec1和vec2赋值,因此没有触发这个问题。

内容的提问来源于stack exchange,提问作者Theorist

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 12:40:33