在C语言中读取可变长度字符串的简便方法有哪些?
问题分析与解决
你的代码存在两个核心问题:
- 野指针未分配内存:
char *input1, *input2;仅声明了字符指针,但没有指向任何有效内存空间,直接用scanf写入会触发未定义行为,大概率导致读取异常或程序崩溃。 - scanf格式字符串错误:
%s[^\n]是错误写法,%s本身会读取到空白字符(换行、空格等)就停止,后面的[^\n]完全无效。而且就算格式正确,第一次读取后输入缓冲区残留的换行符,会导致第二次scanf直接读取到空内容。
修正后的scanf用法
如果坚持用scanf,可按以下方式修改:
// 用数组分配固定内存,避免野指针问题 char input1[100], input2[100]; // 前面加空格跳过缓冲区残留的空白字符,%[^\n]读取到换行符为止 scanf(" %[^\n]", input1); scanf(" %[^\n]", input2);
- 格式字符串
%[^\n]表示读取所有字符直到换行符,前置空格用于跳过之前输入残留的空白(比如第一次输入后的换行)。 - 使用数组而非裸指针,无需手动管理内存,注意数组大小要足够容纳输入内容+结束符
\0。
更简便的替代方法:fgets
fgets比scanf更安全易用,直接读取整行内容:
char input1[100], input2[100]; // 读取整行到数组,最多读取sizeof(input)-1个字符(预留\0位置) fgets(input1, sizeof(input1), stdin); fgets(input2, sizeof(input2), stdin);
如果不需要fgets读取到的换行符,可手动去除:
// 利用strcspn定位换行符位置,替换为结束符 input1[strcspn(input1, "\n")] = '\0'; input2[strcspn(input2, "\n")] = '\0';
内容的提问来源于stack exchange,提问作者Prad
相关产品推荐
相关产品推荐

