Поиск строки в файле (C) - PullRequest
       45

Поиск строки в файле (C)

3 голосов
/ 24 марта 2010

Так что мой код не работает ...

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 ]

3 голосов
/ 24 марта 2010

Изменение

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 для поиска соответствия, вы не сможете найти все вхождения строки поиска в файле. Вы найдете только те строки, которые end в строке поиска.

Пример: ваша строка поиска "hello world" и говорят, что файл содержит 2 строк:

I wrote hello world
hello world is good

В этом случае ваша программа сможет найти только 1-е вхождение, а не 2-е.

Даже для того, чтобы это совпадение было найдено, в ваш код необходимо внести еще некоторые изменения:

Строка, прочитанная fgets, содержит завершающий символ новой строки, от которого вам придется избавиться, например:

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

Также, когда поиск не удался, вы возвращаете 0, который следует изменить на -1.

2 голосов
/ 24 марта 2010

Тип аргумента:

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;
}
2 голосов
/ 24 марта 2010

Если я вас правильно понимаю, вы просто неэффективно переопределяете функцию strstr () libc.

1 голос
/ 24 марта 2010
  1. исправить аргумент для поиска, как говорили другие.
  2. Вам нужно взять адрес content[t], чтобы перейти на strcmp. content[t] это символ, а не строка.
  3. Я думаю, у вас все еще есть несколько других проблем. return 0; например - возможно return -1?

  4. Также ... Я думаю, вам может понадобиться использовать strncmp, чтобы найти термин в строке.

например.

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
}
1 голос
/ 24 марта 2010

попробуйте это:

int search(const char *content, const char *search_term)
0 голосов
/ 24 марта 2010

Попробуйте этот метод вместо:

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

Разница между result и content в точности равна индексу, по которому был найден результат. Я полагаю, это то, что вы ищете?

Я думаю, что есть место для улучшения. Вы не хотите возвращать 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...