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
相关产品推荐
相关产品推荐

