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

为什么C语言printf用%d无法正确输出int类型的data.age与addr.zip

问题根本原因与修复方案

你的代码核心错误是结构体成员的类型定义完全不符合需求,导致内存读写逻辑全部错位,最终int字段输出乱码:

  • 你错误将所有字符串字段定义为char *xxx[长度](字符指针数组),而非存储字符串需要的char xxx[长度](字符数组)
  • 你错误将age、zip字段定义为int *xxx[长度](int指针数组),而非需要的普通int类型
  • 额外逻辑错误:定义了全局addr变量,但ContactInfo结构体本身内嵌了BillingAddress类型的PersonalData成员,你全程没有使用该内嵌成员,逻辑完全脱节
  • scanf传参错误:字符数组本身可直接作为指针传入scanf,不需要额外加取地址符&

修复后的完整代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct BillingAddress {
    char street[50];
    char city[25];
    char state[3];
    int zip;
} address;

typedef struct ContactInfo {
    char name[30];
    int age;
    char phone[15];
    struct BillingAddress PersonalData;
} personaldata;

personaldata data;

int main()
{
    printf("Enter your full name: ");
    scanf(" %29[^\n]", data.name);
    printf("Enter your age: ");
    scanf("%d", &data.age);
    printf("Enter your Phone Number (xxx) xxx-xxxx: ");
    scanf(" %14[^\n]", data.phone);
    printf("Enter your street address: ");
    scanf(" %49[^\n]", data.PersonalData.street);
    printf("Enter your city: ");
    scanf(" %24[^\n]", data.PersonalData.city);
    printf("Enter your state abbreviation: ");
    scanf("%2s", data.PersonalData.state);
    printf("Enter your zip code: ");
    scanf("%d", &data.PersonalData.zip);

    printf("Personal Data: \n %s\n %d\n %s\n %s\n %s\n %s\n %d\n", 
            data.name, data.age, data.phone, 
            data.PersonalData.street, data.PersonalData.city, 
            data.PersonalData.state, data.PersonalData.zip);
    return 0;
}

核心修改说明

  1. 所有字符串成员删除多余的*,改为普通字符数组,age、zip改为普通int类型,避免指针数组导致的内存越界、类型不匹配问题
  2. 删除全局addr变量,直接使用personaldata结构体中内嵌的PersonalData存储地址信息,逻辑对齐
  3. 修正scanf参数:字符数组直接传入,不需要加&,同时调整输入长度限制匹配数组大小,避免缓冲区溢出
  4. printf输出参数全部匹配对应类型,int字段用%d输出即可得到正确结果

内容的提问来源于stack exchange,提问作者dejjen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 07:06:07