为什么scanf()输入的变量无法输出存储值反而打印内存地址?
问题原因
scanf()的格式字符串中,除了%d这类格式占位符之外的所有普通字符,都要求用户在输入时完全逐字符匹配输入,否则会直接匹配失败、终止读取。
你代码里把提示文本enter the value:直接写在了scanf()的格式串中,程序运行时不会主动输出这段提示,反而会等待用户先手动输入完全一致的enter the value:前缀,再输入整数才能完成正确赋值。
如果运行时直接输入数字,scanf()匹配不到要求的前缀字符,读取操作直接失败,此时valueEntered是未初始化的局部int变量,存储的是栈内存里的随机脏值,输出时就会显示无意义的随机数,看起来和内存地址类似。
修复方法
- 输入提示文本不要放在
scanf()格式串内,单独用printf()打印输出 - 建议校验
scanf()的返回值,确认整数读取成功后再使用对应变量,避免读取未初始化的内存脏值
修复后的可正常运行代码如下:
#include <stdio.h> #include <stdlib.h> int main() { int valueEntered, x; printf("enter the value:"); // 校验scanf返回值,成功读取1个整数时才继续逻辑 if (scanf("%d", &valueEntered) != 1) { printf("输入错误,请输入合法整数\n"); return EXIT_FAILURE; } x = valueEntered; printf("the value entered is:%d\n", x); return EXIT_SUCCESS; }
运行程序后会先主动打印输入提示,直接输入整数即可正常读取赋值,不会再出现输出随机值的问题。
内容的提问来源于stack exchange,提问作者AlvinV
相关产品推荐
相关产品推荐

