使用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
相关产品推荐
相关产品推荐

