在文件中搜索字符串(C)

时间:2010-03-24 13:18:27

标签: c arrays pointers replace

所以我的代码无效......

test.c:27: warning: passing argument 1 of ‘search’ from incompatible pointer type

这是fgets行。

我的代码打开一个文件,逐行读取文件,我正在尝试创建一个“搜索”函数,它将返回一个值,指示是否在文件的该行找到该字符串。

我的最终目标是实现搜索和替换程序。但是一步一步呃? 这就是我到目前为止所做的:

#include <stdio.h>
#include <string.h>

int search(const char *content[], const char *search_term)
{
    int t;

    for(t=0; content[t]; ++t){
        if(!strcmp(content[t], search_term)){
            return t; // found
        }
    }
    return 0; // not found
}


int main(int argc, char *argv[])
{
    FILE *file;
    char line[BUFSIZ];
    int linenumber=0;
    char term[20] = "hello world";

    file = fopen(argv[1], "r");
    if(file != NULL){
        while(fgets(line, sizeof(line), file)){
            if(search(line, term) != -1){
                printf("Search Term Found!!\n");
            }
            ++linenumber;
        }
    }       
    else{
        perror(argv[1]); 
    }

    fclose(file);
    return 0;
}

6 个答案:

答案 0 :(得分:3)

更改

int search(const char *content[], const char *search_term)

int search(const char content[], const char *search_term)

编辑:

同样改变:

if(!strcmp(content[t], search_term)){

if(!strcmp(&content[t], search_term)){

if(!strcmp(content + t, search_term)){

由于您使用strcmp来查找匹配项,因此您无法在该文件中找到所有出现的搜索字符串。您只会在search_string中找到 end 的那些行。

示例:您的搜索字符串为“hello world”,并说该文件有2行:

I wrote hello world
hello world is good

在这种情况下,您的程序将只能找到第一次出现而不是第二次出现。

即使找到了这个匹配项,您的代码也需要进行一些更改:

fgets读取的字符串有一个尾随换行符,你必须像它一样摆脱它:

while(fgets(line, sizeof(line), file)){
  line[strlen(line)-1] = 0;

如果搜索失败,您将返回0,应将其更改为-1

答案 1 :(得分:2)

如果我理解正确,你只是以非常低效的方式重新实现strstr()libc函数。

答案 2 :(得分:2)

参数类型:

const char *content[]

不正确。使用:

const char *content  

/

#include <stdio.h>
#include <string.h>

int search(const char *content, const char *search_term)
{
    int t;

    for(t=0; content+t; ++t){
        if(!strcmp(content[t], search_term)){
            return t; // found
        }
    }
    return 0; // not found
}


int main(int argc, char *argv[])
{
    FILE *file;
    char line[BUFSIZ];
    int linenumber=0;
    char term[20] = "hello world";

    file = fopen(argv[1], "r");
    if(file != NULL){
        while(fgets(line, sizeof(line), file)){
            if(search((const char*)line, term) != -1){
                printf("Search Term Found!!\n");
            }
            ++linenumber;
        }
    }       
    else{
        perror(argv[1]); 
    }

    fclose(file);
    return 0;
}

答案 3 :(得分:1)

试试这个:

int search(const char *content, const char *search_term)

答案 4 :(得分:1)

  1. 将搜索参数修复为其他人所说的。
  2. 您需要将content[t]的地址传递给strcmpcontent[t]是一个字符,而不是字符串。
  3. 我认为你还有其他一些问题。例如return 0; - 也许是return -1

  4. 此外......我认为您可能需要使用strncmp来查找该行中的字词。

  5. 例如

    int search(char *content, const char *search_term)
    {
        int t;
    
        for(t=0; content[t]; ++t){
            if(!strncmp(&content[t], search_term, strlen(search_term))){
                return t; // found
            }
        }
        return -1; // not found
    }
    

答案 5 :(得分:0)

请尝试使用此方法:

int search(const char *content, const char *search_term)
{
   char *result = strstr(content, search_term);
   if(result == NULL) return 0;
   return (int)(result - content);
}

resultcontent之间的差异正是找到结果的索引。我相信这就是你要找的东西?

我认为虽然有改进的余地。您不希望在不匹配时返回0,因为在第一个字节位置(也是0)的匹配可能会混淆。相反,如果必须返回一个整数,则返回-1

if(result == NULL) return -1;

然而,更进一步,你可以看到这个方法如何只是你以后甚至没有使用的功能的包装器。如果您在main中关心的是否找到了字符串,只需完全删除此函数并写下main,如下所示:

int main(int argc, char *argv[])
{
   FILE *file;
   char line[BUFSIZ];
   int linenumber = 1;
   char term[20] = "hello world";

   file = fopen(argv[1], "r");
   if(file != NULL) {
      while(fgets(line, sizeof(line), file)){
         if(strstr(line, term) != NULL) {
             printf("Search Term Found at line %d!\n", linenumber);
         }
         ++linenumber;
      }
   }
   else {
      perror(argv[1]);
   }

   fclose(file);
   return 0;
}