为什么我的C语言printAdd函数无法正常输出?无终端报错却无信息打印
问题分析与修复
你的代码存在两处关键错误,直接导致printAdd函数无法正常输出:
1. state字段的类型与输入输出格式不匹配
结构体中state是单个char类型,但你错误使用了字符串格式符%s:
- 输入时,
scanf("%s", &add[0].state);会往单个字符的内存空间写入字符串(含终止符\0),直接越界覆盖内存,破坏程序栈结构; - 输出时,
printf用%s输出单个char值,会将该字符的ASCII值当作内存地址访问,触发非法内存操作,导致输出异常甚至程序中断。
2. 读取city时多余的取地址符
add[0].city是数组名,本身就是指向数组首元素的地址,无需额外加&,多余的取地址符会导致类型不匹配(虽然多数情况下可能侥幸运行,但属于错误写法)。
修复后的完整代码
#include<stdio.h> struct address { int houseNo; int block; char city[100]; char state; }; void printAdd(struct address add); int main(){ struct address add[5]; printf("enter info for person 1 : \n"); scanf("%d", &add[0].houseNo); scanf("%d", &add[0].block); scanf("%s", add[0].city); // 去掉多余的& scanf(" %c", &add[0].state); // 用%c读取单个字符,前置空格跳过换行残留 printAdd(add[0]); return 0; } void printAdd(struct address add){ printf("address is : %d, %d, %s, %c\n", add.houseNo, add.block, add.city, add.state); // 将%s改为%c匹配char类型 }
补充说明
- 用
%c读取单个字符时,前置空格" %c"是为了跳过之前输入操作留下的换行符,避免直接读取空白字符; - 如果
state需要存储字符串(比如州名缩写),需将结构体中state改为数组,例如char state[10];,此时才能用%s进行输入输出。
内容的提问来源于stack exchange,提问作者Ayush Kumar
相关产品推荐
相关产品推荐

