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
相关产品推荐
相关产品推荐

