[C] Problem ze 'zjadaniem' liter przez program


(Michalgromadzki) #1

Witam, mam problem ze 'zjadaniem' przez program liter/znaków, jeśli zamieniam na wejściu np. literę "a" lub "A" (tak, jak w programie), tak aby na wyjściu otrzymać zamiast niej "44", to mam takie cudo:

Wszystko spoko, tylko jak na wejściu dam "Witam cie", to na wyjściu otrzymuje "Wit44 cie" - pożarło "m", czyli następną po tej literze "a" literę.

Tak samo, gdybym zrobił z "a" lub "A" na wyjściu "444":

na wejściu "Witam cie", to na wyjściu dostaję "Wit444cie" - pożarło 2 następne litery, po literze "a".

Pomyślałem nawet o tym, żeby zwiększać wtedy długość znaków:

dl+=3;

ale to jedynie zwiększa plik na końcu o 3 spacje, czyli otrzymamy: "Wit44 cie " i odpowiednio ""Wit444cie ".

Ktoś mądry pomoże :lol: ?


(Damgora) #2

Ty nie dodajesz tych czwórek, tylko zamieniasz na nie znak a lub A i następny (lub dwa następne).

w tym przypadku zd to 'a', zd[i+1] to 'm', a zd[i+2] jest spacją


(Grzelix) #3

w twoim rozwiązanie powinno wyglądać mniej więcej tak:

ustalić długość nowej tablicy która będzie zawierać tyle więcej znaków ile wystąpień litery a.

int ndl = 0;

for(i=0; i
  if(zd[i]=='a' || zd [i]=='A'){

   ndl++;

  }

}

char nzd[dl+ndl]

i w drugim przebiegu odpowiednie zmienić ciąg wejsciowy

for(i=0;j=0; i

  if(zd[i]=='a' || zd [i]=='A'){

   nzd[j] = '4';

  j++;

  nzd[j] = '4';

  }else{

   nzd[j] = zd[i];

  }

}

wynik wtedy jest w nowej tablicy


(Michalgromadzki) #4

Czyli, że niby ma być jakoś tak? Coś mi nie bangla:

#include 

#include 

int il(char lol[])

{

    int tmp=1;

    int i;

    for(i=0; i<100; i++)

    {

        if(lol[i]==' ' && lol[i+1]==' ')

        {

            tmp=i;

            break;

        }

    }

    return tmp;

}

int main()

{

    char zd[100];

    int i;

    int j;

    for(i=0; i<100; i++)

        zd[i]=' ';

    int dl=0;

    FILE *fptr;

    fptr=fopen("a.txt", "r");

    i=1;

    while(fgets(zd,100,fptr)!=NULL);

    fclose(fptr);

    dl=il(zd);

    int ndl=0;

    for(i=0; i
    {

        if(zd[i]=='a' || zd [i]=='A')

        {

            ndl++;

        }

    }

    char nzd[dl+ndl];

    for(i=0; j=0; i
    {


        if(zd[i]=='a' || zd [i]=='A')

        {

            nzd[j]='4';

            j++;

            nzd[j]='4';

        }

        else

        {

            nzd[j]=zd[i];

        }

    }

    FILE *fp;

    fp=fopen("b.txt", "w");

    for(i=0; i
        fprintf (fp, "%c", zd[i]);

    fclose (fp);

    return 0;

}

(Sawyer47) #5

W kod się nie wgłębiałem bo jest nieczytelny (stosuj wcięcia, nazywaj zmienne bardziej opisowo, komentuj gdzie trzeba, kod umieszczaj wewnątrz 'code' na forum), ale jeśli długość napisu nie jest znana w czasie kompilacji trzeba użyć dynamicznej alokacji (malloc).


(Michalgromadzki) #6

Faktycznie, mój błąd, poprawiłem wcięcia.


(Grzelix) #7

zwrot nie bangla rozumiem że nie jest poprawny wynik.

A pisałem

czyli wypisujesz tak:

for(i=0; i
        fprintf (fp, "%c", nzd[i]);

(Michalgromadzki) #8

Faktycznie, dzięki za podpowiedź w tej kwestii, czyli:

#include 

#include 

int il(char lol[])

{

    int tmp=1;

    int i;

    for(i=0; i<100; i++)

    {

        if(lol[i]==' ' && lol[i+1]==' ')

        {

            tmp=i;

            break;

        }

    }

    return tmp;

}

int main()

{

    char zd[100];

    int i;

    int j;

    for(i=0; i<100; i++)

        zd[i]=' ';

    int dl=0;

    FILE *fptr;

    fptr=fopen("a.txt", "r");

    i=1;

    while(fgets(zd,100,fptr)!=NULL);

    fclose(fptr);

    dl=il(zd);

    int ndl=0;

    for(i=0; i
    {

        if(zd[i]=='a' || zd [i]=='A')

        {

            ndl++;

        }

    }

    char nzd[dl+ndl];

    for(i=0; j=0; i
    {


        if(zd[i]=='a' || zd [i]=='A')

        {

            nzd[j]='4';

            j++;

            nzd[j]='4';

        }

        else

        {

            nzd[j]=zd[i];

        }

    }

    FILE *fp;

    fp=fopen("b.txt", "w");

    for(i=0; i
        fprintf (fp, "%c", nzd[i]);

    fclose (fp);

    return 0;

}

Tylko że kompilator się 'czepia' za tą linijkę for(i=0; j=0; i


(Sawyer47) #9

for ma 3 zasadnicze części oddzielone średnikami: for(1; 2; 3), jeśli chcesz aby w 1 i 3 znalazło się więcej operacji, oddziel je operatorem , (przecinek).


(Michalgromadzki) #10

No i zaoszczędziłeś mi kilkanaście minut życia, dzięki za podpowiedź, wszystko działa :smiley: .

-- Dodane 08.01.2011 (So) 17:00 --

Proszę mi jeszcze powiedzieć, czy jest jakiś sposób, żeby program czytał większe pliki? Chodzi o to, że teraz mogę wczytać plik, który zawiera łącznie max. 127 znaków:

#include 

#include 

int il(char lol[])

{

    int tmp=1;

    int i;

    for(i=0; i<127; i++)

    {

        if(lol[i]==' ' && lol[i+1]==' ')

        {

            tmp=i;

            break;

        }

    }

    return tmp;

}

int main()

{

    char zd[127];

    int i;

    int j;

    for(i=0; i<127; i++)

        zd[i]=' ';

    int dl=0;

    FILE *fptr;

    fptr=fopen("a.txt", "r");

    i=1;

    while(fgets(zd,127,fptr)!=NULL);

    fclose(fptr);

    dl=il(zd);

    int ndl=0;

    for(i=0; i
    {

        if(zd[i]=='a' || zd [i]=='A')

        {

            ndl++;

        }

    }

    char nzd[dl+ndl];

    for(i=0, j=0; i
    {


        if(zd[i]=='a' || zd [i]=='A')

        {

            nzd[j]='4';

            j++;

            nzd[j]='4';

        }

        else

        {

            nzd[j]=zd[i];

        }

    }

    FILE *fp;

    fp=fopen("b.txt", "w");

    for(i=0; i
        fprintf (fp, "%c", nzd[i]);

    fclose (fp);

    return 0;

}

Z tego co pamiętam, char ma do 127, więc tak też ustawiłem (już przy 128 program nie chodził). Próbowałem też zamienić wszystkie char na unsigned char (który ma chyba do 255), ale nic z tego.

Jest jakiś sposób na 'obejście tego'? Chciałbym, żeby chociaż trochę większe pliki mi obsługiwał...