为什么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; }
核心修改说明
- 所有字符串成员删除多余的
*,改为普通字符数组,age、zip改为普通int类型,避免指针数组导致的内存越界、类型不匹配问题 - 删除全局
addr变量,直接使用personaldata结构体中内嵌的PersonalData存储地址信息,逻辑对齐 - 修正scanf参数:字符数组直接传入,不需要加&,同时调整输入长度限制匹配数组大小,避免缓冲区溢出
- printf输出参数全部匹配对应类型,int字段用
%d输出即可得到正确结果
内容的提问来源于stack exchange,提问作者dejjen
相关产品推荐
相关产品推荐

