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

使用fscanf读取字符串遇问题:仅能匹配首个目标字符串

问题分析与解决方案

首先,你遇到的这个问题核心原因就是文件指针的位置偏移,和空格其实没关系~

为什么只输出第一个匹配结果?

当你第一次调用indexOfhor函数时,fptr1(指向input2.txt的文件指针)会从文件开头开始逐行读取,找到第一个目标字符串Xanthos后,文件指针已经停在了input2.txt中该行之后的位置。

等到循环处理第二个目标字符串Myra时,fptr1并没有回到文件开头,而是从上次停下的位置继续往后读——如果后面的内容里没有Myra(或者已经读到文件末尾了),自然找不到匹配,也就不会输出结果。

为什么添加rewind(fptr1)就解决了问题?

rewind()函数的作用就是将文件指针重置到文件的起始位置。每次循环处理新的目标字符串前,调用它让fptr1回到input2.txt的开头,这样indexOfhor就能重新从第一行开始查找新的目标字符串,自然就能找到所有匹配项了。

优化后的完整代码

把rewind(fptr1)放到循环里,确保每次查找新单词前重置文件指针:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFFER_SIZE_2 150
int indexOfhor(FILE *fptr, const char *word, int *line, int *col);
int main(){
    FILE *fptr;
    FILE *fptr1;
    FILE *fptr2;
    int line ,col;
    char word[10];
    fptr = fopen("input.txt","r");
    fptr1= fopen("input2.txt", "r");
    fptr2= fopen("output.txt","a");
    while (fscanf(fptr, "%s", word) != EOF ) {
        rewind(fptr1); // 每次查找新单词前重置文件指针到开头
        indexOfhor(fptr1, word, &line, &col );
        if(line != -1 ){
            fprintf(fptr2,"%s (%d,%d)\n", word, line + 1, col + 1);
        } else if(line==-1) continue;;
    }
    fclose(fptr);
    fclose(fptr1);
    fclose(fptr2);
    return 0;
}
int indexOfhor(FILE *fptr, const char *word, int *line, int *col){
    char str[BUFFER_SIZE_2];
    char *pos;
    *line = -1;
    *col = -1;
    while ((fgets(str, BUFFER_SIZE_2, fptr)) != NULL) {
        *line += 1;
        pos = strstr(str, word);
        if (pos != NULL){
            *col = (pos - str);
            break;
        }
    }
    // If word is not found then set line to -1
    if (*col == -1) *line = -1;
    return *col;
}

额外小提示

  • fscanf(fptr, "%s", word)会自动跳过空格,所以input.txt里的空格不会影响单词的读取,这也是为什么问题和空格无关的原因。
  • 可以考虑添加文件打开失败的判断(比如if(fptr == NULL)),让程序更健壮,避免空指针错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:36:35