Forum: PC-Programmierung Buchstabenersetzung aus Datei


von Julian (jollepe)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe ein Problem mit einer Aufgabe.
Ich möchte ein Programm zeilenweise einlesen.
Dann wird jede Zeile in ein Array kopiert und anschließend
überprüft ob ein Arrayelement mit einem Char vergleichen.
Wird an einer Stelle eine Übereinstimmung gefunden, so wird diese Stelle
gegen einen anderen Buchstaben ausgetauscht.
Anschließend werden alte und neue Zeile mittels printf ausgegeben und
die Gesamtanzahl der Buchstabenersetzungen ausgegeben.

Ich weiß leider nicht wo mein Fehler liegt, da die Textersetzung
nicht funktioniert.

Hier mein Programmcode:
1
#include <stdio.h>
2
#include <stdlib.h>
3
int main ()
4
5
{
6
    FILE *input;
7
    int     n   = 0;    // Aufzählungsvaribale
8
    char    bs1 = 0;    // Buchstabe zu ersetzen
9
    char    bs2 = 0;    // Buchstabe ersetzt
10
    int     i   = 0;    // Laufvariable (for)-Schleife
11
    int     ers = 0;    // Gesamt an Ersetzungen
12
    char    feld [80];  // Feld aus Datei
13
14
15
    printf  ("Buchstabe 1: ");
16
    scanf   ("%s", &bs1);
17
    printf  ("Buchstabe 1: %c \n",bs1);
18
19
    printf  ("Buchstabe 2: ");
20
    scanf   ("%s", &bs2);
21
22
    printf  ("Buchstabe 2: %c \n\n\n",bs2);
23
24
25
    // Öffnet die Quelldatei
26
    input = fopen( "beispieltext.txt", "r" );
27
28
        // Überprüfen ob Datei gelesen wurde
29
        if (input == NULL)
30
        {
31
            printf ("Quelldatei nicht lesbar.\n");
32
            return -1;
33
        }
34
35
        // Datei wurde erfolgreich gelesen -> Zeile in String speichern
36
        else
37
        {
38
            // Kopiert jede Zeile in das feld
39
            while ( fgets (feld , 80 , input) != NULL )
40
                {
41
                    n++;
42
                    printf ("%d. Zeile Original:\t %s",n, feld);
43
44
                    // Das Feld wird mit den Buchstaben verglichen und ggf ersetzt
45
                    for (i=0; i>=80; i++)
46
                        {
47
                            if (feld[i]==bs1)
48
                                {
49
                                feld[i]=bs2;
50
                                ers++;
51
                                }
52
                            else
53
                                {
54
                                continue;
55
                                }
56
                        }
57
                    printf ("%d. Zeile Neu:\t\t %s",n, feld);
58
                    printf ("--------------------\n\n\n");
59
                }
60
        printf ("Insgesamt %dx Ersetzungen!\n",ers);
61
        fclose (input);
62
        }
63
    return 0;
64
}

von Peter II (Gast)


Lesenswert?

> for (i=0; i>=80; i++)

hier würde ich noch mal drüber nachdenken.

von Michael S. (captain-stone)


Lesenswert?

> Ich weiß leider nicht wo mein Fehler liegt, da die Textersetzung
> nicht funktioniert.

Das ist ein sehr großer Oberbegriff "nicht funktioniert"


>                     for (i=0; i>=80; i++)
>                         {
>                             if (feld[i]==bs1)
>                                 {
>                                 feld[i]=bs2;
>                                 ers++;
>                                 }
>                             else
>                                 {
>                                 continue;
>                                 }
>                         }

Ich nehme an, Du hast an die for Schleife Deinen Breakpoint gesetzt, 
oder? Was passiert danach in den Variablen? Was zeigt die Variable i 
denn an, wenn sie hochzählt? Kommen gleiche Zeichen zustande bei bs1 und 
bs2?

Sag mal genau, an welcher Stelle es im SingleStep nicht funktioniert.

von Julian (jollepe)


Lesenswert?

Michael Steinbauer schrieb:
> Ich nehme an, Du hast an die for Schleife Deinen Breakpoint gesetzt,
> oder? Was passiert danach in den Variablen? Was zeigt die Variable i
> denn an, wenn sie hochzählt? Kommen gleiche Zeichen zustande bei bs1 und
> bs2?

Die for-Schleife soll am Ende des Feldes also i==79 aufhören.
Demnach (sollte) die Funktion die Felder von 0-79 durchlaufen und 
jeweils das Element mit dem Char-Wert (ein Buchstabe) vergleichen.

Jedoch sieht es in der Praxis so aus, dass anscheinend die Ersetzung 
nicht durchläuft, da das feld == feld' ist.

von Peter II (Gast)


Lesenswert?

Julian R. schrieb:
> Jedoch sieht es in der Praxis so aus, dass anscheinend die Ersetzung
> nicht durchläuft, da das feld == feld' ist.

nein wie schon oben geschrieben - der fehler ist hier:

> for (i=0; i>=80; i++)

von Julian (jollepe)


Lesenswert?

Peter II schrieb:
> Julian R. schrieb:
>> Jedoch sieht es in der Praxis so aus, dass anscheinend die Ersetzung
>> nicht durchläuft, da das feld == feld' ist.
>
> nein wie schon oben geschrieben - der fehler ist hier:
>
>> for (i=0; i>=80; i++)

Ich finde da leider nicht meinen Fehler.
Habe es mit i==79 probiert, jedoch die gleiche Problematik

von Peter II (Gast)


Lesenswert?

Julian R. schrieb:
> Ich finde da leider nicht meinen Fehler.

dann schau noch mal genau hin wie eine for schleife funktioniert.

von Julian (jollepe)


Lesenswert?

Peter II schrieb:
> Julian R. schrieb:
>> Ich finde da leider nicht meinen Fehler.
>
> dann schau noch mal genau hin wie eine for schleife funktioniert.

Asche über mein Haupt. Manchmal sieht man den Wald vor lauter Bäumen 
nicht.

Es wird nun die Gesamtanzahl der Ersetzungen angezeigt, jedoch wird das 
feld' nicht verändert. Zudem erhalte ich wahrscheinlich 
Speicher-garbage...

von Peter II (Gast)


Lesenswert?

Julian R. schrieb:
> Es wird nun die Gesamtanzahl der Ersetzungen angezeigt, jedoch wird das
> feld' nicht verändert. Zudem erhalte ich wahrscheinlich
> Speicher-garbage...

du überschreibst dir ja auch fleißig den speicher

 char    bs2 = 0;
 scanf   ("%s", &bs1);

%s steht für string, du willst aber ein zeichen einlesen.

von Julian (jollepe)


Lesenswert?

Peter II schrieb:
> Julian R. schrieb:
>> Es wird nun die Gesamtanzahl der Ersetzungen angezeigt, jedoch wird das
>> feld' nicht verändert. Zudem erhalte ich wahrscheinlich
>> Speicher-garbage...
>
> du überschreibst dir ja auch fleißig den speicher
>
>  char    bs2 = 0;
>  scanf   ("%s", &bs1);
>
> %s steht für string, du willst aber ein zeichen einlesen.

Die Problematik ist dann für ein %c, dass die erste Scanf-Abfrage 
durchgeht und die zweite komplett überspringt und gleich in den 
Algorithmus geht

von Dirk B. (dirkb2)


Lesenswert?

Das einlesen der Buchstaben ist auch verkehrt.
%s dient zum einlesen von C-Strings. Und die sind immer nullterminiert.
Darum brauchst du Platz für zwei zeichen.

Der richtige Formatspecifier dafür ist %c.
Und damit du beim zweiten Buchstaben nicht das '\n' von der Entertaste 
einliest, gehört noch ein Leerzeichen davor:
1
scanf(" %c", &bs1);
2
       ^ wichtig

von Julian (jollepe)


Lesenswert?

Vielen Dank an Alle!
Jetzt läuft es endlich.

von Dirk B. (dirkb2)


Lesenswert?

Noch eine Frage:
Warum willst du die Datei zeilenweise einlesen?

Zeichenweise mit fgetc wäre weniger aufwendig.

von Julian (jollepe)


Lesenswert?

Dirk B. schrieb:
> Noch eine Frage:
> Warum willst du die Datei zeilenweise einlesen?
>
> Zeichenweise mit fgetc wäre weniger aufwendig.

Aufgabenstellung des Dozenten ;-)

von Dirk B. (dirkb2)


Lesenswert?

Ach, noch etwas.

Bis jetzt ging es ja nur um das "Vorzeichen" von dem Vergleich (< statt 
>=).

Allerdings ist die Bedingung hier auch verkehrt. Wenn die Zeile nur ein 
Zeichen enthält, prüfst du trotzdem alle 80. Auch den Müll der vorher 
drin stand.

Du liest einen C-String ein und diese sind ja nullterminiert.
Darum:
1
for (i=0; feld[i]!='\0'; i++)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.