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

在C语言中读取可变长度字符串的简便方法有哪些?

问题分析与解决

你的代码存在两个核心问题:

  1. 野指针未分配内存:char *input1, *input2; 仅声明了字符指针,但没有指向任何有效内存空间,直接用scanf写入会触发未定义行为,大概率导致读取异常或程序崩溃。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 18:46:42