Grep: Linie zawierające podane słowo

0

Mam problem z zadaniem:/
Napisz program grep, który przyjmuje jako argument wywołania napis oraz nazwę pliku tekstowego i
wypisuje na standardowe wyjście wszystkie linie tego pliku zawierające podany napis. Przyjmij, że każda
linia ma najwyżej 255 znaków łącznie ze znakiem końca wiersza. Program załącza tylko plik nagłówkowy stdio.h
raz dwa trzy
raz trzy
sto dwanaście
DWA


int main (int argc, char *argv[]) {
FILE *input = fopen(argv[2], "r");
char slowo[100];
slowo[100]=argv[1];
char line[256];
int j=0;
int end=0;
int c;
            while (fgets(line, 256, input)){
                for (int i = 0; line[i]; ++i) {
                if (line[i] != ' ' && line[i] != '\t' && line[i] != '\n'){
                        end = 1 + i;
                 if (line[i]!=slowo[j]) {i++; }

                
                else {  j++;
                fprintf (stdout, "%s", line);}

                }
else  line[end] = '\0';}}
fclose(input);


            }
            ```
0

Na czym polega problem? Wyniki są losowe/powtarzalne?
Dużo trzeba "wywróżyć", więc mogę się kompletnie mylić.

raz dwa trzy
raz trzy
sto dwanaście
DWA

To jest przykładowy plik wejściowy? Nie widzę szukanego wyrażenia ani wyniku, więc nic mi to nie pomaga :/
Ta linia slowo[100]=argv[1]; nie ma sensu, jednak w języku C jest poprawna (taki strzał w stopę, przed którym nic Cię nie broni).
Jeśli chcesz skopiować argument do tablicy słowo musisz to zrobić znak po znaku lub użyć, np. funkcji strcpy/strncpy lub sprintf/snprintf z stdio.h.

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

int main (int argc, char *argv[]) {
    FILE *input = fopen(argv[2], "r");
    char *slowo = argv[1];
    char line[256];
    char *elem;
    int line_number = 1;
    while (fgets(line, 256, input)){
        if((elem = strstr(line, slowo))!=NULL){
            printf("Linia: %d\n", line_number);
        }
        line_number++;
    }
    fclose(input);
    return 0;
}
0

Problem polega na tym, że program ma przeszukiwać linie i jeśli w np 1 linii jest słowo "dwa" to ma wypisać całą linie, a jeśli nie ma to przejść do kolejnej linii i ją sprawdzić.
Więc z wejścia pliku tekstowego:
raz dwa trzy
raz trzy
sto dwanaście
DWA
ma wyjść :
raz dwa trzy
sto dwanaście

1

Aaa no to źle zrozumiałem treść, myślałem że chodzi o wypisanie lini w sensie ich numerów, no to w takim razie będzie tak:

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

int main (int argc, char *argv[]) {
    FILE *input = fopen(argv[2], "r");
    char *slowo = argv[1];
    char line[256];
    char *elem;
    int line_number = 1;
    while (fgets(line, 256, input)){
        if((elem = strstr(line, slowo))!=NULL){
            printf("%s", line);
        }
        line_number++;
    }
    fclose(input);
    return 0;
}
2

Tutaj z zaimplementowaną funkcja szukającą:

#include <stdio.h>

char* strstr(char *str, char *substr);

int main (int argc, char *argv[]) {
    FILE *input = fopen(argv[2], "r");
    char *slowo = argv[1];
    char line[256];
    int line_number = 1;
    while (fgets(line, 256, input)){
        if(strstr(line, slowo)!=NULL){
            printf("%s", line);
        }
        line_number++;
    }
    fclose(input);
    return 0;
}

char* strstr(char *str, char *substr)
{
	  while (*str) 
	  {
          char *Begin = str;
          char *pattern = substr;
          while (*str && *pattern && *str == *pattern) 
          {
              str++;
              pattern++; 
        }
        if (!*pattern)
            return Begin;
        str = Begin + 1;
    }
    return NULL;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1