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

C++读取文本时程序崩溃,输入名字后直接闪退是什么原因?

代码错误汇总

以下是导致程序异常的3个核心问题:

  • scanf_s格式串多余\n

scanf系列函数的格式串中\n属于空白匹配符,会持续吞噬输入中的空白字符直到遇到非空白内容。你输入名字回车后,第一个scanf_s不会终止,会继续等待输入,导致第二个输入逻辑无法触发。

  • 传参类型不匹配

数组名first_name本身就是首元素地址,符合%s要求的char*类型,额外添加&后传入的是数组指针char (*)[10],类型错误会触发未定义行为,直接导致崩溃。

  • 缺少scanf_s必填的缓冲区长度参数

安全输入函数scanf_s处理字符串输入时,必须在缓冲区地址后传入缓冲区的最大容量,避免输入内容溢出数组边界。

修复后可正常运行的代码
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    char first_name[10];
    char last_name[10];

    printf("What is your first name? >");
    scanf_s("%s", first_name, (unsigned)sizeof(first_name));

    printf("What is your last name? >");
    scanf_s("%s", last_name, (unsigned)sizeof(last_name));

    printf("Hello and welcome %s %s!\n", first_name, last_name);

    return 0;
}
额外优化建议
  • 可以把格式串写成%9s,限制最多读取9个字符,预留1个字符位置存储字符串结束符\0,就算输入内容过长也不会超出数组容量,更安全。
  • 如果需要支持带空格的姓名输入,不要用%s,改用%[^\n]格式符,配合清空输入缓冲区的逻辑即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 03:45:02