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

逐词读取文件输出(null)序列,求原因及fscanf空格处理问题

问题分析与解答:读取文件输出(null)及fscanf空白字符疑问

首先来说你遇到的(null)(null)...输出问题,看你的代码片段,核心错误出在内存分配的步骤:

for(i = 0; i < SIZE_QUOTE; i++){
    if(!(malloc(sizeof(char) * (size_t)WORD_LENGTH)))
        exit(1);
}

你在这里循环调用malloc申请了内存,但并没有把申请到的地址赋值给quote[i]!也就是说quote数组里的每个指针还是未初始化的垃圾值(大概率是NULL,这就是输出(null)的直接原因),后续用fscanf往这些指针指向的位置写数据不仅会出问题,甚至可能导致程序崩溃。

正确的写法应该是把malloc的结果赋值给quote[i]:

for(i = 0; i < SIZE_QUOTE; i++){
    quote[i] = malloc(sizeof(char) * (size_t)WORD_LENGTH);
    if(!quote[i])
        exit(1);
}

另外还有一个常见的坑:你用while(!feof(pf))作为循环条件,这会导致多读一次。因为feof只有在尝试读取文件末尾之后才会被置为真,所以当最后一次读取成功后,循环会再执行一次,这时候fscanf读取失败,quote[i]还是NULL,又会多输出一个(null)。建议改成直接判断fscanf的返回值,比如:

while(i < SIZE_QUOTE && fscanf(pf, "%s", quote[i]) == 1){
    i++;
}

接下来回答你的第二个问题:fscanf会忽略空白字符吗?
分两种情况:

  • 对于大部分格式说明符(比如%s、%d、%f等),fscanf会自动跳过前导的空白字符(包括空格、换行符、制表符等),然后读取到下一个空白字符为止。比如用%s读取单词时,会自动跳过单词之间的空格和换行,直接读取连续的非空白字符。
  • 但如果是%c、%[、%n这几个格式说明符,fscanf不会忽略空白字符。比如%c会读取当前输入流中的第一个字符,不管它是不是空格或换行;%[abc]会匹配指定集合中的字符,也不会跳过前导空白。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:51:47