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

为什么我的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 04:45:35