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

为何C语言中signUp函数返回输入后print函数未执行?

问题分析与修复方案

你的代码里print函数没执行的核心原因是缓冲区溢出导致程序崩溃,具体问题和修复步骤如下:

问题根源

  • 结构体Person里的street和postalcode被定义成了单个char类型,但你要存的是街道名、邮政编码这类字符串。用scanf("%s", ...)往单个字符里写字符串时,会直接超出内存范围,破坏程序的栈结构,导致signUp函数返回后程序直接崩溃,根本走不到print这一步。
  • 另外printf里用%s输出单个char本身也是错误的,属于未定义行为。

修复步骤

  1. 把结构体里的street和postalcode改成字符数组,设置足够的长度来存字符串;
  2. 调用scanf时,数组名本身就是地址,不用加&(整数类型的number还是要加);
  3. 给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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 06:21:37