c-problem

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
GhostLight
Beiträge: 59
Registriert: 27.12.2003 16:17:08
Wohnort: nähe Dortmund
Kontaktdaten:

c-problem

Beitrag von GhostLight » 31.01.2004 18:05:24

Code: Alles auswählen

/*try.c*/

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

main()
{
 FILE *try;
 int i=0;
 char in[100];
 if((try=fopen("try.txt","r")) == NULL)
  {
   printf("\nDatei nicht vorhanden.\n");
  }
 else
  {
   while(fscanf(try,"%s",in[i]) != EOF)
   {
    printf("%s",in[i++]);
   }
  }
}
hallo.
könnte mir wohl jmd sagen, wo da der wurm drinsteckt?
irgendwas in der else schleife ist falsch aber ich seh net was :cry:
kompilieren lässt es sich problemlos.nur wenn ich es dann laufen lasse, kommt

Code: Alles auswählen

 Segmentation Fault
MfG
Philipp
Mir geht es gut. Ich mag die kleinen Pillen, die sie mir dauernd geben. Warum bin ich an das Bett gefesselt?

Benutzeravatar
spiffi
Beiträge: 1128
Registriert: 09.08.2003 19:02:27

Beitrag von spiffi » 31.01.2004 18:30:06

Der Knackpunkt sind diese Zeilen:

Code: Alles auswählen

  while(fscanf(try,"%s",in[i]) != EOF)  /* 1 */
  {
    printf("%s",in[i++]); /* 2*/
  } 
Die mit 1 und 2 markierten Zeilen erwarten (in der hier verwendeten Konstellation) als letzten Parameter einen Pointer auf den Typ char.
Du übergibst aber in beiden Fällen einen char und keinen Pointer auf einen char.
Was dann passiert ist, daß der C-Code den übergebenen Wert als Pointer deutet. Und der zeigt entweder auf 0 (wenn das char-Array mit 0 initialisiert wurde, was der Compiler AFAIK aber nicht machen muß) oder an eine zufällige Stelle im Speicher. Ersteres führt garantiert, zweiteres höchstwahrscheinlich zu einem segfault.
Du könntest stattdessen

Code: Alles auswählen

  while(fscanf(try,"%s",&in[i]) != EOF) 
  {
    printf("%s",&in[i++]);
  } 
schreiben, dann wird der Code (zumindest bei kleinen Dateien) nicht mehr abstürzen, aber er macht auch nicht das, was Du wahrscheinlich möchtest, da fscanf(fp,"%s", pchar) nicht nur ein Zeichen einliest, sondern bis zum nächsten Whitespace.
Wenn Du ein fscanf auf "eins zwei" losläßt, dann steht in i[0] - i[4] das Wort "eins" (also i[0]='e', i[1]='i', ..., i[4]='\0'). Beim nächsten Schleifendurchlauf würdest Du das nächste Wort ab i[1] einlesen. Dann stände von i[1] - i[5] das Wort "zwei", im gesamten Array das Wort "ezwei".

Benutzeravatar
GhostLight
Beiträge: 59
Registriert: 27.12.2003 16:17:08
Wohnort: nähe Dortmund
Kontaktdaten:

Beitrag von GhostLight » 31.01.2004 18:33:27

*hargh*

ich idiot!!! :evil:

ja das wars...

Code: Alles auswählen

while(fscanf(try,"%s",&in[i]) != EOF) 
nja herzliche dank auch :wink:

So long philipp
Mir geht es gut. Ich mag die kleinen Pillen, die sie mir dauernd geben. Warum bin ich an das Bett gefesselt?

Antworten