Forum: PC-Programmierung Tauschprogramm C problem


von Michael H. (m0ddmylife)


Angehängte Dateien:

Lesenswert?

Hallo, habe ein Programm zum tauschen zweier "Sätze" geschrieben.
Nur habe ich leider das Problem das ich nicht weis warum beim 
Tauschergebnis der erste Buchstabe des 1.Satzes IMMER ein "H" ist... 
warum?

danke im vorraus
Michael
1
#include <stdio.h>
2
#include <stdlib.h>
3
4
void tausch(char *satz1, char *satz2)
5
{   
6
    char hilf;
7
    int i;
8
    
9
    for(i=0;i<=80;i++)
10
    {
11
       hilf  = *satz1;
12
      *satz1 = *satz2;
13
      *satz2 = hilf;
14
       
15
      satz1++;
16
      satz2++;    
17
      } 
18
}
19
20
21
int main(void)
22
{ char satz1[80]="";
23
  char satz2[80]="";
24
  printf("\t Satzgewurste\n\n");
25
  printf("Bitte Satz 1 Eingeben:");
26
  gets(satz1);
27
  fflush;
28
  printf("Bitte Satz 2 Eingeben:");
29
  gets(satz2);
30
  fflush;
31
  printf("\n\nEingegebener Satz 1: %s \nEingegebener Satz 2: %s\n", satz1, satz2);
32
  tausch(&satz1, &satz2);
33
  printf("\n\nVerdrehter Satz 1: %s \nVerdrehter Satz 2: %s\n\n\n", satz1, satz2);
34
  
35
  system("PAUSE");  
36
  return 0;
37
}

von Hmm (Gast)


Lesenswert?

Nun, dann analysiere mal das Problem.

Da tauchen Zeichen auf, die Du nicht eingegeben hast. Woher?
Du kopierst aus dem anderen String! Seltsam!

Was steht denn da vorher drin? Na, das was Du ausgibst.

Das auch, aber was gibst Du aus? Wirklich den kompletten Inhalt der 
Strings?
Nein.

Du gibst mit printf aus. Was gibt printf aus? Die Zeichen bis.... Ja, 
bis wohin?

Dann kopierst Du. Was kopierst Du? Was in den Strings steht. Was steht 
in den Strings? Siehe den vorherigen Punkt?

Wieviel kopierst Du? Na alle Zeichen. Wieviele sind das? Wieviele 
Kopieroperationen führst Du aus?

von Thomas R. (Gast)


Lesenswert?

Michael Hakenkötter schrieb:
> int main(void)
> { char satz1[80]="";
>   char satz2[80]="";

mach die Arrays mal um 1 grösser.

char satz1[81]="";
char satz2[81]="";

von Dumdi D. (dumdidum)


Lesenswert?

Ersetz mal in
    for(i=0;i<=80;i++)

<= durch ein <

von Michael H. (m0ddmylife)


Lesenswert?

Thomas R. schrieb:
> mach die Arrays mal um 1 grösser.
>
> char satz1[81]="";
> char satz2[81]="";

Danke, das hat geholfen!

von icke (Gast)


Lesenswert?

Deine tauschschleife ist um eins zu lang!
Du greifst ausserhalb des Arrays auf den Speicher zu.

von Thomas R. (Gast)


Lesenswert?

Trotzdem ist das nicht schön programmiert!
Fazit:
weiterlernen und dran denken, dass ein String immer noch eine Null am 
Ende braucht.

von Michael H. (m0ddmylife)


Lesenswert?

Thomas R. schrieb:
> Trotzdem ist das nicht schön programmiert!
> Fazit:
> weiterlernen und dran denken, dass ein String immer noch eine Null am
> Ende braucht.

wird gemacht! ;)

von Hmm (Gast)


Lesenswert?

@  Michael Hakenkötter
Hast Du denn auch verstanden, was das Problem dabei ist?

von Michael H. (m0ddmylife)


Lesenswert?

Jap. mit den 80 Kopierten zeichen hat er sich eines aus einem "fremden" 
speicherbereich geholt...

von Norbert (Gast)


Lesenswert?

Thomas R. schrieb:
> Trotzdem ist das nicht schön programmiert!
> Fazit:
> weiterlernen und dran denken, dass ein String immer noch eine Null am
> Ende braucht.

Ich lehne mich mal sehr weit aus dem Fenster und behaupte das
1
gets(satz1);
2
gets(satz2);
jeweils eine implizite Null Terminierung machen.

Wenn man also bei
1
char satz1[80];
nicht mehr als 79 Zeichen eingibt, haben wir da kein Problem.
Die Schleife muß natürlich wie bereits erwähnt korrigiert werden.

AAABER:
1
void tausch(char *satz1, char *satz2)
2
{...}
3
und dann
4
tausch(&satz1, &satz2);

das ist übel und sollte:
1
tausch(satz1, satz2);
heißen.
Mit Pointern treibt man kein Schindluder!

von ... (Gast)


Lesenswert?

Mit welchem Compiler compilierst du das Programm? Wenn es gcc ist, dann 
verwende unbedingt die Option -Wall und am besten noch -Werror. (Alle 
Warnungen anschalten und Warnungen als Fehler betrachten.) Dann passiert 
sowas wie mit den falschen Zeigern nicht.

von Michael H. (m0ddmylife)


Lesenswert?

Ich arbeite mit Dev-Cpp.. der hat keine warnung mehr rausgeschmissen...

von Hmm (Gast)


Lesenswert?

>Ich arbeite mit Dev-Cpp.. der hat keine warnung mehr rausgeschmissen...

Genau deswegen sollst Du ja die Warnungen einschalten. Wenn es trotz 
eingeschalteter Warnungen keine gibt, dann schmeiss den Compiler weg. Er 
wäre schlicht Schrott.

von Norbert (Gast)


Lesenswert?

Michael Hakenkötter schrieb:
> Ich arbeite mit Dev-Cpp.. der hat keine warnung mehr rausgeschmissen...

Der basiert doch auf gcc (Mingw).

Das interessiert mich jetzt mal, Augenblick...
Hier unter Linux:
1
Norbert:/tmp$ gcc x.c
2
x.c: In function main:
3
x.c:32: warning: passing argument 1 of tausch from incompatible pointer type
4
x.c:4: note: expected char * but argument is of type char (*)[80]
5
x.c:32: warning: passing argument 2 of tausch from incompatible pointer type
6
x.c:4: note: expected char * but argument is of type char (*)[80]
7
/tmp/ccWBJ5HR.o: In function `main':
8
x.c:(.text+0xc0): warning: the `gets' function is dangerous and should not be used.

und da sind die Warnungen noch nicht mal explizit eingeschaltet.

von Vn N. (wefwef_s)


Lesenswert?

Michael Hakenkötter schrieb:
> gets(satz1);
>   fflush;

Michael Hakenkötter schrieb:
> system("PAUSE");

Wo hast du sowas denn her? Ich würde mir definitiv einen anderen 
Lehrer/anderes Buch/anderes Tutorial suchen.

von SummerWilli (Gast)


Lesenswert?

>weiterlernen und dran denken, dass ein String immer noch eine Null am
>Ende braucht.
Hat aber mit dem Problem hier überhaupt nichts zu tun.

von Rolf M. (rmagnus)


Lesenswert?

Michael Hakenkötter schrieb:
> Jap. mit den 80 Kopierten zeichen hat er sich eines aus einem "fremden"
> speicherbereich geholt...

Nein. Das Problem ist, daß du 81 Zeichen kopierst und nicht 80.

PS: Der Compiler müßte bei deinem Code übrigens mehrere Warnungen 
erzeugen. Du solltest diese verstehen und entfernen.

von Vn N. (wefwef_s)


Lesenswert?

Michael S. schrieb im Beitrag #3118171:
> DEV-CPP wird doch nicht mehr gepflegt und soll noch noch Bugs enthalten.

Mittlerweile wird es wieder gepflegt, wenn auch nicht von Bloodshed 
(Blodshed bietet immer noch eine veraltete Version an).

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.