Program liczący ilość wystąpienia ciągu znaków w pliku.

0

Witam,

mam problem z programem jak w temacie.
Póki co napisałem coś takiego

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

int main()
{
    char znaki[70];
    char find[20];
    int a,i; a=0;

    FILE *plik;

    if ((plik=fopen("plik.txt","r"))==NULL)
    {
        printf("Blad otwarcia pliku do zapisu");
        exit(1);
    }

    fscanf(plik,"%s", znaki);

    puts("Podaj slowo do znalezienia");
    scanf("%s", &find);

    for (i=0;i<3;i++)
    {
        if (znaki[i,i+1]==find[i,i+1]) a++;
    }

    puts(znaki);

    fclose(plik);

    printf("%d",a);

    return 0;
}

problem na pewno tkwi w pętli która niby ma porównywać ciągi znaków.
Dla szukanego słowa składającego się z 2 znaków to działa ale ja chcę żeby działało bez sztywno ustalonej ilości znaków.
Co Wy na to?

0

Skoro już masz zwartość pliku w C-stringu to nie możesz wykorzystać strstr? http://en.cppreference.com/w/c/string/byte/strstr

I zabezpiecz Twój kod na okazje, kiedy plik/wzorzec są za długie (albo użyj dynamicznej alokacji).

0

ale ten program nie ma wyświetlać tekstu tylko ilość wystąpienia podanego ciągu znaków w tekście z pliku

chyba że można tę funkcję wykorzystać w taki sposób... jak tak to proszę o pomoc jak to zrobić

0

Ten sposób który próbujesz zrealizować ma kilka wad:

  1. masz ograniczenie na ciąg znaków który musi być słowem i ma ograniczoną ilość znaków

  2. masz ograniczenie na rozmiar słowa w pliku
    Jeżeli ci pasują takie ograniczenia to:

  3. Wczytaj szukany wyraz (poprawnie wczytaj - poczytaj o scanf)

  4. Otwórz plik

  5. Wczytuj kolejne słowa dopóki plik się nie skończy

  6. Sprawdzaj if(strstr(SlowoZpliku,SlowoSzukane)) ++licznik;

  7. Zamknij plik.

0

ale co jest źle z tym scanfem? to "%s" ?

0

pozmieniałem w scanfach z %s na %c

zrobiłem tak

    puts("Podaj slowo do znalezienia");
    scanf("%c", find);


    while(znaki!=EOF)
    {
        fscanf(plik,"%c", znaki);
        if(strstr(znaki,find)) ++a;
    }

EDIT
ale program po podaniu słowa nic nie robi, nie da się wprowadzić znaku nawet

0

po długim siedzeniu nad tym programem zauważyłem że program:

int main()
{
    char znaki[20];
    char search[20];

    scanf("%s %s",znaki,search);

    char *se=strstr(znaki, search);

    if (se==NULL) printf("Nie znalazlem %s",search);
    else printf("Znalazlem %s na pozycji %d\n",se,se-znaki+1);

    return 0;
}

działa tylko na %s, więc dlaczego ja mam mieć %c?
przecież ten program robi to samo

0

A kto ci powiedział że masz mieć %c ?

0
ministrant200 napisał(a):

ale co jest źle z tym scanfem? to "%s" ?

szybkie odpowiedzi które są w tym poście mnie zmyliły (tzn. ja z tego wywnioskowałem że %s jest źle) i tyle się nakombinowałem...

0

ok, teraz mam tak

    puts("Podaj slowo do znalezienia");
    scanf("%s", find);


        if(strstr(znaki,find)!=NULL) a++;


    puts(znaki);

ale nie wiem jak użyć dobrze pętli do if, próbowałem ale jak wyrażenie występuje 2 razy to nadal pokazuje 1

i drugi problem - jak mam spację to pokazuje mi treść pliku tylko do spacji

0

Nie ma żadnego sposobu rozwiązania zadania które podałeś na początku bez jakiegoś kontenera który będzie przechowywać zbiór słów.

0

zmienna znaki je przechowuje przecież

0

Czy rozumiesz różnicę pomiędzy ciągiem słów a zbiorem słów?

0

aha, no tak...
ale jak pododawać słowa z ciągu słów do takiej tablicy o zbiorze słów?

0

Najpierw wybierz sobie kontener (do każdego inaczej się dodaje)
do wyboru masz:
char *Tb;
string Tb;
vector<char
> Tb;
vector<string> Tb;
map<char
,size_t> Tb;
map<string,size_t> Tb;
i baaaaaaardzo dużo innych możliwości.

0

string to chyba tylko w c++?

no dobra no to wybór jest jeden dla mnie bo tylko char w c znam,
trochę cienko że z podwójnymi wskaźnikami, ale może podołam

więc jak się za to zabrać z tym kontenerem: char **Tb; ?

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