Hilfe!Finde Fehler in C-Programm nicht!

Hier ein Ausschnitt aus dem Programm:

for (j=1;j

Hi,

mit = weist man zu, und mit == vergleicht man. Du hast das etwas vertauscht.

grüße, Micha

Nicht geholfen
Hi
Ich weis, es stimmt eh überall, im if hab ich ja ein ! davor, und falls solche fehler vorhanden wären, hätte sie gcc ja angezeigt
trotzdem danke fürs bemühen
und ich brauch immer noch HILFE!!!

die forschleife geht, ind pfard[l] test.txt reinschreibt. dann
geht er aber ein zweites mal durch die forschleife und

In pfad[l] wird nicht der Inhalt reinkopiert. Du setzt bloß den Zeiger um auf argv. pfad muss deswegen auch ein Array von char-Pointern sein.

Kann das eine Ursache für dein Problem sein?

zeig doch einfach mal ein wenig Code um die Schleife herum. Vielleicht passiert der Fehler auch zwischen den beiden Schleifenaufrufen.

/Dirk

Hier ein Ausschnitt aus dem Programm:

for (j=1;j

#include

int main(int argc, char* argv[])
{ int i,p=0;
char *pfad[5];
for (i=0;i

Am besten schreib ich mal den ganzen Code rein, dann bekomme ich auch eine konkretere Lösung. Ich glaube du bist derjenige der mir helfen kann.

/\*
 \* File: nr.c
 \*
 \* Zweck: Öffnet eine oder mehrere Dateien, nummeriert die Zeilen der
 \* Datein, entweder als ganzes oder getrennt und gibt das Ergebnis
 \* entweder auf STDOUT oder in einer Datei aus
 \*
 \* Autor: Ivan Petrovski
 \*
 \* Algorithmus: Zuerst wird überprüft ob -h als Parameter angegeben
 \* wurde. Falls dies der Fall sit, wird nur der Hilfe-Text ausgegeben
 \* und nichts weiter -\> alle anderen Argumente werden ignoriert. -h kann
 \* nur an erster stelle vorkommen.Sucht nach -z und -o
 \* und vermerkt deren auftreten in den Variablen z und y.
 \* Falls -o auftritt, wird das nachfolgende Argument in
 \* \*write gespeichert. Dann werden alle anderen Argumente
 \* gelesen, sie selbst und deren Anzahl gespeichert.
 \* Dann wird die Funktion ausgabe() so oft ausgeführt wie
 \* die Anzahl der zu öffnenden Datein.
 \*
 \* History: 2003-10-06
 \*/

/\*--------------------------- includes ------------------------------\*/
#include 
#include 
/\*--------------------------- defines -------------------------------\*/
/\*--------------------------- typedefs ------------------------------\*/
/\*--------------------------- globals -------------------------------\*/
int zeilen=0; /\*Wird verwendet um die Zeilennr der bereits geöffneten Datei zu
 \*speichern um damit in der nächsten weiterzählen zu können
 \* -\> bei fortlaufendem Zählen\*/
/\*-------------------------- prototypes -----------------------------\*/
void help(void);
void ausgabe(int z,int y,FILE \*fh);
/\*----------------------------- main --------------------------------\*/
int main( int argc, char \*argv[] )
{
 FILE \*fhr; /\*read\*/
 FILE \*fhw; /\*write\*/
 char \*pfad[5]; /\*Bis zu 5 Dateien können geöffnet werden\*/
 char \*write; /\*Der Pfad der zu schreibenden Datei\*/
 int z=0; 
 int y=0;
 int j;
 int l=0;

 if (argv[1][0]=='-' && argv[1][1]=='h')
 {
 help();
 }
 else
 {
 for (j=1;j
----------------------------------------------------
Danke für dein bemühen

/*
So, hier nun ein kleines Programm für dein Problem.
Ich hab da ein paar kleine Tricks verwendet, wie eben erst mal das Sammeln aller Optionen in einem Hilfsstring. Das erspart viele Verzweigungen. Ansonsten lese ich einfach Zeilenweise ein und zähle mit.
Ausserdem ‚missbrauche‘ ich manche Strings od. Variablen gleich als Flags
*/

#include „stdafx.h“ // Windows only
#include
#include // getch()
#include // strcat()

#include // system(), Debug only

int flg_single= 0;

int ReadLine(FILE *fp, char *s)
{ char c;
int cnt=0;
while (fread(&c,1,1,fp) && (c != 10)) { // 10 = CR
*s++= c;
cnt++;
}
*s= ‚\0‘; // Terminierung nicht vergessen
return cnt;
}

/* Nette kleine Variante für ReadLine!!! Merken!!!
*
* int read(FILE *fp, char *s) { return (fscanf(fp, „%[^\r\n]\n“, s)); }
*
*/

int Ausgabe (char *fnam_in, char *fnam_out)
{
FILE *f_out,*f_in= fopen (fnam_in,„r“);
if (fnam_out) f_out= fopen (fnam_out,„a“); // wenn NULL, dann halt nicht
int cnt,lines=0;
char s[300];
while (!feof(f_in)) {
cnt= ReadLine (f_in,s); //cnt Würde auch noch die Zeichen pro Zeile zählen
lines++;
}
if (flg_single) {
sprintf (s,„Datei: %s hat %d Zeilen\n“,fnam_in,lines);
if (fnam_out) { //wir wollen in eine Datei schreiben
fwrite (s,1,strlen (s),f_out);
fclose (f_out); // zumachen nicht vergessen
} else printf (s); // sonst stdout
fclose (f_in); // d.o.
}
// Wenn nicht flag_single (-z) brauchen wir ja gar nichts auszugeben oder zu schreiben
// Nur im Hauptprogramm die Rückgabewerte zusammenzählen
return lines;
}

void help () { printf („Usage: blubbersenf“); }

int InStr (char *s,char c) // Hilfsroutine
{
for (int i=0;i Datei schreiben (pfad[0])
else lines+= Ausgabe (pfad[i],NULL); // sonst keine Ausgabedatei
if (!flg_single) {
sprintf (s,„Insgesamt %d Zeilen\n“,lines);
if (first) { // Datei
FILE *f= fopen (pfad[0],„w“);
fwrite (s,1,strlen (s),f);
fclose (f);
} else printf (s); //stdout
}

// Debug only Gibt die Out-Datei dann mittels DOS type gleich aus

if (first) {
sprintf (s,"%s %s",„type“,pfad[0]);
system (s);
}

// End Debug only

getch();
return 1;
}

Hallo,

da Du Unix/Linux nutzt, welche C-Library verwendest Du denn? Wenn es die glibc ist, dann hast Du Glück, weil es da die „argp“ Funktionen gibt, die Dir das nervige parsing des Argumentvektors abnehmen. Du musst dazu die argp.h inkludieren.

POSIX-konform gibt es die getopt-Funktion (enthalten in unistd.h).

Schau mal in die zugehörige Dokumentation. Unter Linux: „info libc“.

Es hilft zwar nicht unmittelbar, Deinen Fehler zu finden. Aber generell sollte man das Rad nicht mit Gewalt ein zweites mal erfinden.

Ach und noch watt: Der Compiler meckert natürlich nicht, wenn Du = und == verwechselst.

Gruß

Fritze

Compiler meckert bei = und == doch

Ach und noch watt: Der Compiler meckert natürlich
nicht, wenn Du = und == verwechselst.

Hallo Fritze!

Unter Umständen tut er das: Dann nämlich, wenn Du beim Vergleich auf der linken Seite eine Konstante schreibst (was natürlich nicht immer, aber doch recht oft geht).

Statt „if (wert == 0)“ besser „if (0 == wert)“ zu schreiben hat mir schon einige Male eine lange Fehlersuche erspart.
if (0 = wert) kann er nämlich definitiv nicht - wie soll er auch…

Gruß,
Martin *derheutenurbesserwisserischebeiträgeauflagerhat*

2 Like