C语言字符串空格输入问题:输入姓名后程序终止无法输入国家
问题原因及修正方案
核心问题分析
- 变量类型错误:
name和country是字符串类型,你却声明为float(浮点型),这会导致内存越界、数据错乱,scanf无法正确写入字符串,直接触发未定义行为,程序可能提前终止。 - scanf格式符错误:读取含空格的字符串应该用
%[^\n],你写成了%[s^\n],错误的格式符会让scanf匹配失败,直接跳过后续输入操作。 - 输入缓冲区残留换行符:输入年龄后按下的回车键(
\n)会留在输入缓冲区中,直接用%[^\n]读取姓名时,会把这个换行符当作输入结束,导致姓名读取为空,后续流程异常。
修正后的代码
#include <stdio.h> int main() { int age; char name[100], country[100]; // 用char数组存储字符串,指定足够长度 printf("Age:"); scanf("%d", &age); printf("Name:"); scanf(" %[^\n]", name); // 格式符前加空格跳过残留换行,读取到换行为止 printf("Country:"); scanf("%s", country); // 输出验证 printf("\n你的信息:\n"); printf("年龄:%d\n", age); printf("姓名:%s\n", name); printf("国家:%s\n", country); return 0; }
补充说明
- 声明字符串时要指定足够的数组长度,避免输入过长导致缓冲区溢出。
%[^\n]的作用是读取所有字符直到遇到换行符,这样就能捕获包含空格的完整姓名。格式符前加空格,会自动跳过输入缓冲区中的空白字符(包括换行、空格、制表符),解决残留换行的问题。- 如果需要更安全的输入,可以使用
fgets替代scanf,避免缓冲区溢出风险。
内容的提问来源于stack exchange,提问作者taemm
相关产品推荐
相关产品推荐

