Buchstabenersetzung aus Datei

OP #3525570
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
}
Angehängte Dateien:
#3525586
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.
OP #3525601
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.
OP #3525630
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...
Gast #3525636
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.
OP #3525650
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
#3525656
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
#3525716
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++)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren