Tauschprogramm C problem

#3117892
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
}
Angehängte Dateien:
Gast #3117910
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?
Gast #3117967
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!
Gast #3118005
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.

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