VSCode运行C语言时scanf无法赋值、printf输出异常问题求助
问题排查及解决方案
核心错误1:printf中错误使用取地址符&
你混淆了scanf和printf的参数规则:
- C语言中
&是取地址运算符,作用是获取变量在内存中的存储地址 scanf需要传入变量地址,是因为函数需要直接修改对应内存地址中存储的内容,完成用户输入的写入printf只需要读取变量的值,直接传入变量名即可,加&会导致输出的是变量的内存地址而非存储的数值,这也是你遇到输出异常、编译器提示格式不匹配警告的直接原因
你需要删除所有printf语句中变量前的&,示例如下:
原错误写法:
printf("Die Zahl ist %i und die Genauigkeit %i\n\n", &a, &g);
修正后写法:
printf("Die Zahl ist %i und die Genauigkeit %i\n\n", a, g);
同理循环内的&i、&x,以及最终输出的&x都需要删掉前缀的&。
核心错误2:牛顿迭代逻辑错误
当前代码循环内每次执行t = a,相当于每次迭代都从初始值重新计算,完全没有迭代逼近的效果,需要把初始值赋值放到循环外,每次迭代更新迭代变量的值,修正后的逻辑如下:
// 初始值赋值放在循环外 t = a; for(int i=0; i<g; i++) { x = 0.5 * (t + (a/t)); t = x; // 更新迭代变量,用于下一轮计算 printf("Schritt Nr.: %d \n", i); printf("x%d: %f \n\n",i, x); }
修复后的完整代码
#include <stdio.h> #include <ctype.h> int main() { float x; //Ergebnisvariable, Anfangswert float t; //Hilfsvariable zur Berechnung int a; //Zahl zur Berechnung int g; //Genauigkeit (Anzahl der Durchgänge) printf(" Berechnung einer der Quadratwurzel einer Ganzzahl mit dem Newtonschen Annäherungsverfahren:\n\n"); printf("Für welche Zahl soll angenähert die Quadratwurzel errechnet werden?\n"); scanf("%i",&a); printf("Genauigkeit wählen (1,2,3,4)\n"); scanf("%i",&g); printf("Die Zahl ist %i und die Genauigkeit %i\n\n", a, g); printf("Starte Berechnung für %d in %d Schritten.\n\n", a, g); // Berechnung t = a; for(int i=0; i<g; i++) { x = (0.5)*(t+(a/t)); t = x; printf("Schritt Nr.: %d \n", i); printf("x%d: %f \n\n",i, x); } printf("Endergebnis: %f \n\n", x); }
该问题和VSCode配置、操作系统无关,属于C语言语法使用错误,编译器给出的警告已经明确提示传入的指针类型(int */float *)和格式符要求的数值类型不匹配。
内容的提问来源于stack exchange,提问作者Cassandra Schäwel
相关产品推荐
相关产品推荐

