为何C语言中signUp函数返回输入后print函数未执行?
问题分析与修复方案
你的代码里print函数没执行的核心原因是缓冲区溢出导致程序崩溃,具体问题和修复步骤如下:
问题根源
- 结构体
Person里的street和postalcode被定义成了单个char类型,但你要存的是街道名、邮政编码这类字符串。用scanf("%s", ...)往单个字符里写字符串时,会直接超出内存范围,破坏程序的栈结构,导致signUp函数返回后程序直接崩溃,根本走不到print这一步。 - 另外
printf里用%s输出单个char本身也是错误的,属于未定义行为。
修复步骤
- 把结构体里的
street和postalcode改成字符数组,设置足够的长度来存字符串; - 调用
scanf时,数组名本身就是地址,不用加&(整数类型的number还是要加); - 给
scanf加输入长度限制,防止用户输入过长的字符串再次溢出。
修复后的完整代码
#include <stdio.h> #include <stdlib.h> typedef struct { char street[50]; // 定义字符数组存储街道名 int number; char postalcode[20]; // 定义字符数组存储邮政编码 } Person; void print(Person p) { printf("Street: %s\n", p.street); printf("Number: %d\n", p.number); printf("Postal code: %s\n", p.postalcode); } Person signUp() { Person person; printf("In which street do you live on?: \n"); scanf("%49s", person.street); // 限制输入49个字符,留位置存结束符\0 printf("What is your number?: \n"); scanf("%d", &person.number); printf("What is your postal code?: \n"); scanf("%19s", person.postalcode); // 限制输入19个字符 return person; } int main(void) { Person person; person = signUp(); print(person); return 0; }
补充说明
- 数组长度可以根据实际需求调整,比如街道名可以设成
char street[100];,对应的scanf就改成%99s; - 加长度限制是为了避免用户输入超长字符串再次触发缓冲区溢出,这是C语言里处理字符串输入的基本防护手段。
内容的提问来源于stack exchange,提问作者user20676816
相关产品推荐
相关产品推荐

