sai charan_12 Ответов: 3

Как сделать программу на языке Си, которая имитирует команду grep, и она также должна работать в linux...только последняя строка в файле печатается 2 раза..


напишите программу на языке Си, чтобы имитировать команду "grep", которая находится в linux...и ошибка заключается в том, что если мы ищем шаблон, который находится в файле...если этот шаблон находится в последней строке, то он ищет и печатает 2 раза ...за исключением последней строки, если мы ищем шаблон, который находится в другой строке, он печатает именно эту строку 1 раз

Что я уже пробовал:

#include<stdio.h>
#include<string.h>
void main()
{
char fn[30],pat[30],temp[200];
FILE *fp;
printf("Enter file name\n");
scanf("%s",fn);
printf("Enter pattern to be searched\n");
scanf("%s",pat);
fp=fopen(fn,"r");
while(!feof(fp))
{
fgets(temp,1000,fp);
if(strstr(temp,pat)!=NULL)
printf("%s",temp);
}
fclose(fp);
}

Richard MacCutchan

Вы выделили 200 символов для temp, но затем вызываете fgets и говорите ему, что temp имеет длину 1000 символов. Используйте #defines для установки размеров массива, чтобы везде использовать одно и то же значение.

k5054

А еще лучше, используйте getline() напр.
#включить <stdio.h>
#include <stdlib.h>

char *input = NULL;
size_t len = 0
определены input_len;

input_len = вызовом getLine(&ампер;вход &амп;лен стандартного ввода);
/* ... ввод процесса ... */
бесплатно(вход);

Richard MacCutchan

И я не думаю, что это предназначалось для меня тоже. У тебя сегодня плохой день?

sai charan_12

могу ли я получить точный код для этого ответа, пожалуйста

sai charan_12

я много пробовал, но не могу его закодировать, так что, пожалуйста ...

Rick York

Я написал свой собственный grep много-много лет назад и не утруждал себя оценкой причудливых выражений. Я просто принял аргумент в пользу соответствия с учетом регистра или нет, что весьма полезно. Затем я добавил простой сопоставитель подстановочных знаков, чтобы принимать различные шаблоны имен файлов. Это тоже было очень полезно.

Я рекомендую начать с немного более простой реализации, что-то вроде того, что я описал.

3 Ответов

Рейтинг:
0

phil.o

Начните с документирования себя о команде grep, чтобы вы могли составить список функций для репликации:
в Linux команда grep[^]

Затем задокументируйте себя о регулярных выражениях в языке Си:
с помощью регулярных выражений[^]

Когда вы выполнили прежние задачи, тогда вы можете начать думать о том, как вы собираетесь реализовать его.


sai charan_12

на самом деле я получаю вывод небольшая ошибка может ли вы мне помочь

phil.o

Нет, потому что вы не предоставили никакой информации ни о том, что вы пробовали, ни о том, что это за ошибка.

sai charan_12

сэр я дал код что я пытался и я упомянул ошибку в программе сейчас сэр

Рейтинг:
0

OriginalGriff

Начните с чтения чего grep делает: Учебник Команды Grep С Примерами Для Начинающих - OSTechNix[^] должно быть началом, но это сложная программа, и как только вы справитесь с этим, вы, вероятно, захотите работать и с большинством из них: grep tutorial - поиск в Google[^]

Как только вы полностью поймете это, вы можете начать работать с одним "сердцем" . grep - процессор регулярных выражений.
C не имеет ни одного из них встроенного, так что вам, вероятно, придется написать свой собственный. Потребуется больше чтения: Давайте построим движок регулярных выражений | Александр Гребенюк[^]

Не ожидайте, что это будет "быстрый проект" - я бы сам искал недели, чтобы все исправить, поэтому относительный новичок должен планировать значительно больше времени!

Удачи вам!


sai charan_12

сэр, я уже знаю, что grep делает в linux ..он ищет нужный шаблон из файла и печатает всю строку, в которой содержится шаблон...я получаю небольшую ошибку в выводе..только если мы ищем шаблон, который находится в последней строке, которая печатается 2 раза....может ли вы помочь, что не так в programme..is программа, которую я написал-это corect ? я буду очень благодарен если вы поможете мне сэр

OriginalGriff

Используйте отладчик и выясните, что происходит.

Но если вы думаете, что strstr делает то, что делает регулярное выражение, вы будете в шоке, когда узнаете правду! Функция strstr-это очень простая функция сопоставления символов, ни в коей мере не похожая на процессор регулярных выражений!

Рейтинг:
0

Rick York

Вот как бы я прочитал этот файл :

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

#define BUFFER_LENGTH = 511;

int main( int ac, char * av[] )
{
    char lineBuffer[BUFFER_LENGTH+1];
    FILE *fp = NULL;
    int count = 0;

    if( ac < 3 )
    {
        fprintf( stderr, "A string pattern and a file name are required\n" );
        return 1;
    }

    fp = fopen( av[2], "r" );
    if( ! fp )
    {
        fprintf( stderr, "Error - unable to open %s\n", av[2] );
        return 2;
    }

    while( fgets( lineBuffer, BUFFER_LENGTH, fp ) )
    {
        if( strstr( lineBuffer, av[1] ) )
        {
            printf( "%s", lineBuffer );
            ++count;
        }
    }
    fclose( fp );
    printf( "found %d occurrences\n", count );
    return 0;
}