Alle Fragen aus de.comp.lang.c

[ FAQ in de.comp.lang.c ]


Diese FAQ bezieht sich in ihrer Gänze auf den inzwischen nicht mehr aktuellen ISO-C Standard 9899:1990, vielfach auch als C90 bezeichnet. Der seit Dezember 1999 existierende neue ISO 9899:1999 Standard (oder auch C99) wird nicht berücksichtigt.


[ Inhalt ][ Index ][ ZurÜck ][ Weiter ]

Alle Fragen aus de.comp.lang.c

0: de.comp.lang.c

Frage 0.1: Was ist de.comp.lang.c?

Frage 0.2: Was wird genau in de.comp.lang.c diskutiert?

Frage 0.3: Welche Themen gehören nicht nach de.comp.lang.c?

Frage 0.4: Welche Fragen führen traditionell zu heftigen Reaktionen?

Frage 0.5: Wozu soll diese Newsgruppe gut sein, wenn ich nur zum Standard, nicht aber zu meinem tatsächlichen Compiler Fragen stellen darf?

Frage 0.6: Wozu soll eigentlich diese Beschränkung auf K&R C bzw. ANSI C als "reine Lehre" gut sein?

Frage 0.7: Wo sollen denn Fragen zu einem bestimmten Compiler gepostet werden, wenn nicht in de.comp.lang.c?

Frage 0.8: Meine Frage dreht sich aber wirklich nur um ANSI-C. Darf ich sie jetzt posten?

Frage 0.9: Wie sollte eine Frage in de.comp.lang.c aussehen?

Frage 0.10: Ich habe hier ein Programm das nicht läuft. Soll ich es zusammen mit der Problembeschreibung posten?

Frage 0.11: Ich habe selten Zeit de.comp.lang.c zu lesen. Kann ich bei einer Frage um Antwort per Mail bitten?

Frage 0.12: Jemand hat eine in der FAQ enthaltene Frage in de.comp.lang.c gestellt. Wie soll man darauf reagieren?

Frage 0.13: Ich kenne die Antwort auf eine gerade gestellte Frage. Soll ich sie gleich posten?

Frage 0.14: Ich habe nur wissen wollen, wie ich in C den Bildschirm lösche. Jetzt habe ich einige unfreundliche Mails erhalten, in denen es heißt, diese Frage sei in de.comp.lang.c irrelevant. Was für Leute schreiben sowas?

Frage 0.15: In letzter Zeit sieht man häufig die Zeichenfolge "[HOT]" vor Antworten. Was bedeutet das?

1: Null-Zeiger

Frage 1.1: Was ist denn nun eigentlich dieser verflixte Null-Zeiger?

Frage 1.2: Wie erzeuge ich einen Null-Zeiger in meinen Programmen?

Frage 1.3: Was ist NULL und wie sieht sein #define aus?

Frage 1.4: Wie sollte das #define für NULL auf einer Maschine aussehen, auf der Null-Zeiger intern nicht mit einem Bitmuster aus lauter Nullen dargestellt werden?

Frage 1.5: Wenn NULL etwa so definiert wäre:

	#define NULL ((char *)0)

würde das nicht das Problem mit den fehlenden Typumwandlungen bei Funktionsaufrufen lösen?

Frage 1.6: Ich verwende das Präprozessor-Makro

	      #define nullzeiger(typ) (typ *)0

um korrekt typisierte Null-Zeiger zu erhalten.

Frage 1.7: Ist die Abkürzung "if(z)" als Test auf Nicht-Null-Zeiger zulässig? Was, wenn die interne Repräsentation für Null-Zeiger nicht 0 ist?

Frage 1.8: Wenn NULL und 0 dasselbe sind, was soll ich denn dann nun verwenden?

Frage 1.9: Ist es nicht besser, NULL statt 0 zu verwenden, falls sich der Wert von NULL einmal ändert - beispielsweise auf Maschinen mit Null-Zeigern ungleich 0?

Frage 1.10: Jetzt bin ich aber etwas durcheinander: bei NULL ist der Wert garantiert 0, beim Null-Zeiger aber nicht?

Frage 1.11: Warum ist die Unsicherheit in Bezug auf Null-Zeiger eigentlich so groß? Warum werden diese Fragen so oft gestellt?

Frage 1.12: Ich begreife es immer noch nicht: wie soll ich eigentlich mit diesen Null-Zeigern umgehen?

Frage 1.13: Bei all dem Durcheinander, das mit dem Begriff Null-Zeiger einhergeht - wäre es nicht wirklich einfacher zu verlangen, dass sie intern durch 0 dargestellt werden?

Frage 1.14: Nun mal im Ernst: gibt es überhaupt irgendwelche Maschinen, die Null-Zeiger ungleich 0 oder unterschiedliche Darstellungen für Zeiger unterschiedlichen Typs verwenden?

Frage 1.15: Was bedeutet die Fehlermeldung: "null pointer assignment" und wie kann ich die Ursache isolieren?

2: Arrays und Zeiger

Frage 2.1: Ich hatte die Definition char a[6] in einer Quelltextdatei und in einer anderen habe ich extern char *a deklariert. Warum hat das nicht funktioniert?

Frage 2.2: Aber ich habe gehört dass char a[] das gleiche wie char *a ist.

Frage 2.3: Was ist dann mit der "Äquivalenz von Zeigern und Arrays" in C gemeint?

Frage 2.5: Wie kann ein Array ein Lvalue sein, wenn man ihm nichts zuweisen kann?

Frage 2.6: Warum liefert sizeof nicht die wirkliche Größe eines Arrays das ein Parameter einer Funktion ist?

Frage 2.7: Jemand hat mir erklärt, dass Arrays in Wirklichkeit nur konstante Zeiger sind.

Frage 2.8: Vom praktischen Standpunkt betrachtet, was ist der Unterschied zwischen Arrays und Zeigern?

Frage 2.9: Ich bin auf "scherzhaften" Quelltext gestoßen, in dem der Ausdruck 5["abcdef"] vorkam. Wie kann so etwas in C erlaubt sein?

Frage 2.10: Mein Compiler beschwert sich, wenn ich ein zweidimensionales Array an eine Funktion übergebe, die einen Zeiger auf einen Zeiger erwartet.

Frage 2.11: Wie schreibe ich Funktionen, die zweidimensionale Arrays als Argumente annehmen, wenn die "Breite" zum Zeitpunkt der Übersetzung unbekannt ist?

Frage 2.12: Wie vereinbare ich einen Zeiger auf ein Array?

Frage 2.13: Nachdem Bezeichner von Arrays zu Zeigern zerfallen, was ist bei

	   int array[NROWS][NCOLUMNS];

der Unterschied zwischen array und &array?

Frage 2.14: Wie kann ich dynamisch ein mehrdimensionales Array allozieren?

Frage 2.15: Wie können sowohl statisch als auch dynamisch allozierte Arrays an die gleiche Funktion übergeben werden?

Frage 2.16: Es gibt einen praktischen Trick: wenn man

	   int realarray[10];
	   int *array = &realarray[-1];

schreibt, kann array wie ein Array mit der Basis 1 verwendet werden.

Frage 2.17: Ich habe einen Zeiger an eine Funktion übergeben, die ihn beschreibt:

	   ...
	   int *ip;
	   f(ip);
	   ...

	   void f(ip)
	   int *ip;
	   {
	      static int dummy = 5;
	      ip = &dummy;
	   }

Der Zeiger in der aufrufenden Funktion hat sich aber nicht verändert.

Frage 2.18: Ich habe einen Zeiger von Typ char * der auf einige ints zeigt, und ich möchte diese verarbeiten. Warum funktioniert

	   ((int *)p)++;

nicht?

Frage 2.19: Kann ein Zeiger vom Typ void ** verwendet werden, um einen Zeiger von beliebigem Typ per Referenz an eine Funktion zu übergeben?

3: Speicherbelegung (dynamischer Speicher)

Frage 3.1: Warum funktioniert dieser Schnippsel nicht?
	char *ergebnis;
	printf("Gib etwas ein:\n");
	gets(ergebnis);
	printf("Du hast \"%s\" eingegeben.\n", ergebnis);

Frage 3.2: strcat funktioniert einfach nicht. Ich benutze

	char *s1 = "Hallo, ";
	char *s2 = "Welt!";
	char *s3 = strcat(s1, s2);

und bekomme sehr seltsame Ergebnisse.

Frage 3.3: Aber "man strcat" sagt, strcat nimmt zwei Argumente vom Typ char *. Wie soll ich wissen, dass ich mich um die Speicherbelegung kümmern muß?

Frage 3.4: Meine Funktion soll einen String zurückgeben, aber ihr Rückgabewert enthält nur Datenmüll.

Frage 3.5: Warum benutzen manche Programme ausdrückliche Typkonversionen, um den Rückgabewert von malloc() in eine Zeiger des Typs zu verwandeln, für den Speicher alloziert wurde?

Frage 3.6: Mein Programm stürzt - scheinbar innerhalb eines Aufrufs von malloc() ab, aber ich kann den Fehler nicht finden.

Frage 3.7: Wenn dynamisch allozierter Speicher freigegeben wurde, kann man ihn nicht mehr benutzen. Oder doch?

Frage 3.8: Ich reserviere Speicher für structs, die Zeiger auf weitere dynamisch belegte Objekte enthalten. Müssen die anderen Objekte, auf die Zeiger meiner Struktur zeigen, freigegeben werden, bevor ich die Struktur freigeben kann?

Frage 3.9: Muß ich allen dynamisch belegten Speicher am Ende des Programms wieder freigeben?

Frage 3.10: Ich habe ein Programm geschrieben, das große Speicherbereiche dynamisch belegt und dann wieder freigibt. Wenn ich mir (mit ps) anschaue, wieviel Speicher mein Programm benötigt, so ändert der sich allerdings nicht.

Frage 3.11: Woher weiß free(), wie viele Bytes es freigeben soll?

Frage 3.12: Gibt es dann einen Weg, vom malloc-Paket zu erfahren, wie groß ein belegter Block ist?

Frage 3.13: Darf ich einen NULL-Zeiger als erstes Argument an realloc() übergeben? Wozu soll das gut sein?

Frage 3.14: Worin besteht der Unterschied zwischen calloc() und malloc()? Füllt calloc() auch Zeiger- und Gleitkomma-Felder mit Null-Werten? Brauche ich ein cfree() oder kann free() auch mit calloc() reservierte Speicherbereiche freigeben?

Frage 3.14: Was ist alloca() und warum soll man es nicht benutzen?

4: Ausdrücke

Frage 4.1: Warum funktioniert dieser Schnippsel
	a[i] = i++;

nicht?

Frage 4.2: Bei meinem Compiler liefert

	int i = 7;
	printf("%d\n", i++ * i++);

49. Sollte das Ergebnis nicht 56 lauten, egal in welcher Reihenfolge die Terme ausgewertet werden?

Frage 4.3: Ich habe ein wenig mit

	int i = 2;
	i = i++;

experimentiert. Bei manchen Compilern hatte i danach den Wert 2, bei anderen 3 und bei einigen 4. Ich verstehe ja, dass das Verhalten undefiniert ist, aber wie kann dabei 4 herauskommen?

Frage 4.4: Kann ich die Reihenfolge, in der Teilausdrücke ausgewertet werden, nicht durch Klammern festlegen? Selbst ohne Klammern sollte die Reihenfolge doch durch die Rangfolge der Operatoren vorgeschrieben sein.

Frage 4.5: Und wie steht es mit den &&-, ||- und Komma-Operatoren? Ich sehe häufiger Ausdrücke der Form

	if((c = getchar()) == EOF || c == '\n') ...

Frage 4.6: Wenn ich den Wert eines Ausdrucks nicht brauche, sollte ich i++ oder ++i verwenden, um den Wert von i zu erhöhen?

Frage 4.7: Warum funktioniert

	int a = 1000, b = 1000;
	long int c = a * b;

nicht?

5: ANSI/ISO C

Frage 5.1: Was ist der "ANSI-C Standard?"

Frage 5.3: Hat jemand ein Programm, das C-Programme im alten Stil nach ANSI-C übersetzt und dabei automatisch Prototypen generiert?

Frage 5.4: Ich will einen String generieren, der den Wert einer symbolischen Konstante enthält; dazu verwende ich den '#'-Operator des ANSI-C Präprozessors. Mein String enthält jedoch den Namen des Makros statt seines Wertes.

Frage 5.5: Warum kann ich keine "const"-Werte in Initialisierungen oder als Array-Dimensionen verwenden? Z.B.

	const int n = 5;
	int a[n];

Frage 5.6: Was ist der Unterschied zwischen "const char *p" und "char * const p"?

Frage 5.7: Warum kann ich keinen "char **" an ein Funktion übergeben, die einen "const char **" erwartet?

Frage 5.8: Mein ANSI Compiler reklamiert darüber:

	extern int func (float);

	int func (x)
	  float x;
	{...

Frage 5.9: Kann man Funktionsdeklarationen und -definitionen nach altem und neuem Stil mischen? Ist der alte Stil noch erlaubt?

Frage 5.10: Weshalb erhalte ich bei

	extern f (struct x {int s;} *p);

eine Warnung "struct x introduced in prototype scope" oder so ähnlich?

Frage 5.11: Mein Compiler gibt komische Fehlermeldungen in Zeilen, die durch eine #ifdef-Direktive ausgeschlossen sind!

Frage 5.12: Kann ich main() als void deklarieren, um diese störenden Warnungen "main returns no value" zu umgehen? (Ich rufe exit() auf, also gibt es gar kein Return von main.)

Frage 5.13: Ist 'exit(status)' wirklich das Gleiche wie die Rückgabe eines Wertes von 'main'?

Frage 5.14: Warum garantiert der Standard nicht mehr als 6 signifikante Zeichen (Gross- und Kleinschreibung ignoriert!) für externe Bezeichner?

Frage 5.15: Was ist der Unterschied zwischen 'memmove()' und 'memcpy()'?

Frage 5.16: Mein Compiler weigert sich, auch nur die allersimpelsten winzigen Progrämmchen zu übersetzen.

Frage 5.17: Wieso werden manche Funktionen aus der ANSI/ISO-Standard-Bibliothek als "undefiniert" angezeigt, obwohl ich einen ANSI-kompatiblen Compiler habe?

Frage 5.18: Wieso akzeptiert mein Compiler, der angeblich ANSI-konform ist, diesen Code nicht? Ich weiss, dass der Code selbst ANSI-konform ist, denn gcc akzeptiert ihn.

Frage 5.19: Warum ist mit 'void *'-Zeigern keine Zeiger-Arithmetik möglich?

Frage 5.20: Ist char a[3] = "abc"; erlaubt? Was bedeutet das?

Frage 5.21: Was sind #pragmas und wozu sind sie gut?

Frage 5.22: Was bedeutet "#pragma once"? Das kommt in einigen Headerfiles vor.

Frage 5.23: Anscheinend nehmen einige Leute die Unterschiede zwischen "undefined" (undefiniertem), "unspecified" (nicht spezifiziertem) und "implementation-defined" (durch den Compiler definiertem) Verhalten ziemlich ernst. Was ist der Unterschied?

6: Der C Präprozessor

Frage 6.1: Wie schreibe ich ein Makro, um zwei Werte zu vertauschen?

Frage 6.2: Ich habe alten Sourcen, in denen mittels

	#define Paste(a, b) a/**/b

Identifier zusammengebastelt werden, aber das funktioniert nicht mehr.

Frage 6.3: Wie wird ein Makro mit mehreren Statements am besten geschrieben?

Frage 6.4: Darf eine Headerdatei weitere Headerdateien einbinden?

Frage 6.5: Funktioniert der sizeof-Operator in Präprozessor-Direktiven?

Frage 6.6: Wie kann ich in einer #if Direktive herausfinden, ob eine Maschine big- oder little-endian ist?

Frage 6.7: Ich möchte (dies oder das, meist kompliziert) mit dem Präprozessor umwandeln, kann aber nicht herausfinden, wie's geht.

Frage 6.8: Ich muß Code warten, der für meinen Geschmack viel zu viele #ifdefs enthält. Wie kann ich diese Sourcen mit dem Präprozessor bearbeiten, so dass nur eine Variante übrig bleibt, ohne dabei auch alle #includes und #defines zu ersetzen?

Frage 6.9: Wie kann ich eine Liste aller vordefinierten Makro-Bezeichner kriegen?

Frage 6.10: Wie kann ich ein Makro mit einer beliebigen Anzahl von Argumenten schreiben?

7: Variable Argumentlisten

Frage 7.1: Wie kann ich eine Funktion schreiben, die eine variable Anzahl von Argumenten übergeben bekommt?

Frage 7.2: Wie kann ich eine Funktion schreiben, die einen Format-String und eine variable Anzahl von Argumenten nimmt (ähnlich wie printf) und die diese Argumente an printf weitergibt?

Frage 7.3: Wie kann ich zur Laufzeit feststellen, mit wievielen Argumenten eine Funktion aufgerufen wurde?

Frage 7.4: Ich kann den va_arg Macro nicht dazu bringen, ein Argument vom Typ "Zeiger auf eine Funktion" korrekt zu verwenden.

Frage 7.5: Wie kann ich eine Funktion schreiben, die eine variable Anzahl von Argumenten nimmt und diese Argumente an eine andere Funktion weitergeben (die auch eine variable Anzahl von Argumenten nimmt).

Frage 7.6: Wie kann ich eine Funktion mit einer zur Laufzeit erzeugten, variablen Argumentliste aufrufen?

8: Boolesche Ausdrücke und Variablen

Frage 8.1: Welcher Typ wird am besten für boolesche Werte verwendet? Warum gibt es dafür keinen eigenen Typ? Sollte "#define" oder "enum" für TRUE und FALSE benutzt werden?

Frage 8.2: Ist '#define TRUE 1' nicht gefährlich, da jeder von 0 verschiedene Wert in C als 'true' interpretiert wird? Was geschieht, wenn einer der eingebauten Vergleichsoperatoren etwas anderes als 1 zurück gibt?

9: Structs, Enums und Unions

Frage 9.1: Was ist der Unterschied zwischen einem Enum (Aufzählung) und einer Reihe Präprozessor #defines?

Frage 9.2: Ich habe gehört, Structs könnten Variablen zugewiesen werden und an oder von Funktionen übergeben werden, aber K&R I spricht dagegen.

Frage 9.3: Wie funktioniert die Über- und Rückgabe von Structs?

Frage 9.4: Das folgende Programm arbeitet korrekt, bricht jedoch nach dem beenden mit einem core-dump ab. Warum?

	struct list
		{
		char *item
		struct list *next;
		}

	/* Nun das Hauptprogramm */

	main(int argc, char *argv[])
	...

Frage 9.5: Warum kann man Structs nicht vergleichen?

Frage 9.6: Wie kann ich Stucts aus/in Datendateien lesen/schreiben?

Frage 9.7: Ich stolperte über Code, der einen Struct wie diesen hier deklarierte:

	struct name
		{
		int namelen;
		char name[1];
		};

Und dann mittels trickreicher Allokation das Array name so tun ließ als hätte es mehrere Elemente. Ist das legal und/oder portabel?

Frage 9.8: Wie kann ich den Byteoffset eines Elements in einer Struct ermitteln?

Frage 9.9: Wie kann ich auf Structfelder zur Laufzeit per Namen zugreifen?

Frage 9.10: Warum ergibt sizeof für einen Strukturtyp, eine größere Größe als ich erwarte, so als ob da Padding am Ende wäre?

Frage 9.11: Mein Compiler läßt Löcher in Strukturen, was Platz verschwendet und binäres I/O nach externen files verhindert. Kann ich das Padding ausstellen, oder das Alignment von Strukturen anderweitig kontrollieren?

Frage 9.12: Kann ich Unions initialisieren?

Frage 9.13: Wie kann ich konstante Werte an Routinen übergeben, die Struct-Parameter akzeptieren?

10: Deklarationen

Frage 10.1: Wie entscheide ich mich für einen der Integer-Typen?

Frage 10.2: Wie sollte der 64-bit Typ auf neuen, 64-bit-Rechnern aussehen?

Frage 10.3: Ich habe Probleme mit der Definition von verketteten Listen. Bei

	typedef struct
		{
		char *item;
		NODEPTR next;
		} *NODEPTR;

gibt der Compiler eine Fehlermeldung aus. Kann eine C-Struktur keinen Zeiger auf sich enthalten?

Frage 10.4: Wie kann ich ein Array von N Zeigern auf Funktionen deklarieren, die Zeiger auf Funktionen zurückgeben, die Zeiger auf char zurückgeben?

Frage 10.5: Ich programmiere gerade einen Automaten, bei dem jeder Zustand durch eine eigene Funktion realisiert ist. Ich möchte die einzelnen Zustandsübergänge dadurch implementieren, dass eine Funktion einen Zeiger auf die Funktion des Folgezustands übergibt. Dabei werde ich durch die Deklarationsmethode von C behindert. Es gibt keine Möglichkeit, eine Funktion zu deklarieren, die einen Zeiger auf eine Funktion zurückgibt, die einen Zeiger auf eine Funktion ... .

Frage 10.6: Mein Compiler beschwert sich über eine ungültige Redeklaration einer Funktion, dabei definiere ich die Funktion nur einmal und rufe sie einmal auf.

Frage 10.7: Wie deklariert und definiert man globale Variablen am besten?

Frage 10.8: Was bedeutet 'extern' in einer Funktionsdeklaration?

Frage 10.9: Ich habe herausgefunden, wie Zeiger auf Funktionen zu deklarieren sind, nun würde ich gerne wissen, wie ich sie initialisieren kann.

Frage 10.10: Ich habe unterschiedliche Wege gesehen, wie Routinen über Zeiger auf Funktionen aufgerufen werden. Was steckt dahinter?

Frage 10.11: Welchen Sinn hat das Schlüsselwort 'auto'?

11: Stdio

Frage 11.1: Was ist an diesem Code falsch:
	char c;
	while((c = getchar()) != EOF)...

Frage 11.2: Wie kann ich ein '%' Zeichen in einem printf Format String drucken? Ich habe \% versucht, aber es hat nicht funktioniert.

Frage 11.3: Warum funktioniert der Code scanf("%d", i); nicht?

Frage 11.4: Warum funktioniert der Code:

	double d;
	scanf("%f", &d);

nicht?

Frage 11.5: Warum funktioniert der Code

	while(!feof(infp)) {
		fgets(buf, MAXLINE, infp);
		fputs(buf, outfp);
	}

nicht?

Frage 11.6: Warum sagt jeder, dass man gets() nicht benutzen soll?

Frage 11.7: Warum enthält errno den Wert ENOTTY nach dem Aufruf von printf?

Frage 11.8: Mein Programm erwartet eine Eingabe, wobei zwischenzeitliche Ausgaben nicht immer auf dem Bildschirm erscheinen, insbesondere wenn die Ausgabe durch eine Pipe zu einem anderen Programm geleitet wird.

Frage 11.9: Wenn ich mit scanf von einer Tastatur einlese, dann scheint es auf die Eingabe einer zusätzlichen Zeile zu warten.

Frage 11.10: Ich versuche eine Datei direkt zu aktualisieren, indem ich sie mit fopen Mode "r+" öffne, dann einen bestimmten String lese und abschließend den modifizierten String zurückschreibe. Leider scheint das nicht zu funktionieren.

Frage 11.11: Wie kann ich jeweils ein einzelnes Zeichen einlesen, ohne auf die Return-Taste zu warten?

Frage 11.11: Wie kann ich jeweils ein einzelnes Zeichen einlesen, ohne auf die Return-Taste zu warten? Antwort: Siehe Frage 16.1.

Frage 11.13: Wie kann ich stdin oder stdout von einem Programm aus in eine Datei umleiten?

Frage 11.14: Ich habe einmal freopen benutzt. Wie kann ich das originale stdin oder stdout zurückbekommen?

Frage 11.15: Wie kann ich den Namen einer Datei ermitteln, der zu einem bestimmten Dateihandle gehört?

12: Bibliotheksfunktionen

Frage 12.1: Warum setzt strncpy nicht immer ein '\0' an das Ende des Ziel-Strings?

Frage 12.2: Ich versuche, ein Feld von Strings unter Verwendung von strcmp als Vergleichsfunktion mit qsort zu sortieren, aber es funktioniert nicht.

Frage 12.3: Jetzt versuche ich ein Feld von Strukturen mit qsort zu sortieren. Meine Vergleichsfunktion nimmt Zeiger auf Strukturen, aber der Compiler beschwert sich, dass die Funktion vom falschen Typ für qsort ist. Wie kann ich den Funktionszeiger umwandeln, um diese Warnung abzuschalten?

Frage 12.4: Wie kann ich Zahlen in Strings umwandeln (das Gegenteil zu atoi)? Gibt es eine itoa Funktion?

Frage 12.5: Wie kann ich das aktuelle Datum oder die Tageszeit in einem C Programm ermitteln?

Frage 12.6: Ich weiß, dass die Bibliotheksfunktion localtime ein time_t in eine Struktur tm aufteilt, und dass ctime ein time_t in einen druckbaren String umwandelt. Wie kann ich die entgegengesetzte Operation, d.h. die Umwandlung einer Struktur tm oder eines Strings in ein time_t, realisieren?

Frage 12.7: Wie kann ich n Tage zu einem Datum addieren? Wie kann ich die Differenz zwischen zwei Daten bestimmen?

Frage 12.8: Ich brauche einen Zufallszahlengenerator.

Frage 12.9: Wie kann ich zufällige ganze Zahlen in einem bestimmten Bereich erzeugen?

Frage 12.10: Jedes mal, wenn ich mein Programm starte, bekomme ich die gleiche Zahlenfolge von rand() geliefert.

Frage 12.11: Ich brauche einen zufälligen wahr/falsch Wert. Deshalb habe ich rand() % 2 benutzt, erhalte aber nur abwechselnd 0, 1, 0, 1, 0...

Frage 12.12: Ich versuche ein altes Programm zu portieren. Warum bekomme ich "undefined external" Fehlermeldungen für index(), rindex(), bcopy(), bcmp() und bzero()?

Frage 12.13: Ich bekomme ständig Fehlermeldungen wegen undefinierter Bibliotheksfunktionen, obwohl ich alle Headerfiles richtig eingebunden habe.

Frage 12.14: Ich bekomme immer Errors wegen undefinierter Bibliotheks-Funktionen, obwohl ich -l zur Anforderung der Bibliotheken während des Linkens benutze.

Frage 12.15: Ich brauche Quellcode zur Auswertung regulärer Ausdrücke.

Frage 12.16: Wie kann ich die Kommandozeile in durch Whitespaces getrennte Argumente aufteilen, wie die Parameter argc und argv von main()?

13: Lint

Frage 13.1: Ich habe dieses Programm eingetippt und es verhält sich seltsam. Was könnte daran falsch sein?

Frage 13.2: Wie kann ich die Message: "warning: possible pointer alignment problem", die lint bei jedem Aufruf von malloc erzeugt, abschalten.

Frage 13.3: Wo kann ich ein ANSI-kompatibles lint bekommen ?

14: Programmierstil

Frage 14.1: Hier ist ein hübscher Trick:
	if (!strcmp(s1,s2))

Ist das guter Programmierstil?

Frage 14.2: Was ist der beste Codierstil für C?

Frage 14.3: Wo gibt es das "Indian Hill Style Guide" und die anderen angesprochenen Standards?

15: Gleitkomma-Probleme

Frage 15.1: Meine Gleitkommarechnungen zeigen ein eigenartiges Verhalten und/oder führen auf unterschiedlichen Rechnern zu unterschiedlichen Ergebnissen.

Frage 15.2: Ich arbeite mit trigonometrischen Funktionen, habe 'math.h' geladen, erhalte aber "undefined: _sin" u.ä. als Fehlermeldung.

Frage 15.3: Wie runde ich Gleitkommazahlen?

Frage 15.4: Wie teste ich auf IEEE NaN und andere spezielle Werte?

Frage 15.5: Mein Turbo C Programm stürzt mit der Meldung "floating point formats not linked" ab.

Frage 15.6: Wie wird eine Variable nach IEEE-Gleitkommaformat im Rechner dargestellt?

16: Systemabhängiges

Frage 16.1: Wie kann ich einen einzelnen Buchstaben von der Tastatur auslesen, ohne auf RETURN zu warten?

Frage 16.2: Wie finde ich heraus, ob Zeichen zum Einlesen zur Verfügung stehen (und wenn, wieviele)? Oder wie kann ich Zeichen einlesen, ohne dass mein Prozeß blockiert, wenn keine da sind?

Frage 16.3: Wie kann ich den Bildschirm löschen? Wie kann ich Text invers darstellen?

Frage 16.4: Wie lese ich die Maus aus?

Frage 16.5: Wie kann mein Programm den kompletten Pfadnamen der ausführbaren Datei ermitteln, von der es aufgerufen wurde?

Frage 16.6: Wie kann ein Prozeß eine Umgebungsvariable seines aufrufenden Programmes verändern?

Frage 16.7: Wie kann ich überprüfen ob eine Datei existiert? Ich möchte den Anwender fragen, bevor eine vorhandene Datei überschrieben wird.

Frage 16.8: Wie finde ich die Größe einer Datei heraus, bevor ich diese einlese?

Frage 16.9: Wie kann eine Datei gekürzt werden, ohne sie komplett zu löschen oder erneut zu schreiben?

Frage 16.10: Wie kann ich eine Pause (delay) oder die Messung einer Anwender-Reaktion einbauen, welche eine Auflösung im Bereich von Sekundenbruchteilen hat?

Frage 16.11: Wie kann ich Objekt-Dateien einlesen und zu Routinen darin anspringen?

Frage 16.12: Wie kann ich innerhalb eines C-Programmes ein Kommando des Betriebssystems aufrufen?

Frage 16.13: Wie kann ich innerhalb eines C-Programmes ein Kommando des Betriebssystems aufrufen und dessen Ausgaben auffangen?

Frage 16.14: Wie kann ich in einem C-Programm ein Verzeichnis lesen?

Frage 16.15: Wie kann ich serielle ("Comm") Ports nutzen?

17: Verschiedenes

Frage 17.1: Welche Annahmen über die automatische Initialisierung von Variablen sind erlaubt? Reicht eine Initialisierung von Null-Zeigern und Gleitkommavariablen mit 0 aus?

Frage 17.4: Wie kann man in der Mitte einer Datei eine Zeile (oder einen Record) löschen oder einfügen?

Frage 17.5: Wie kann man mehrere Werte aus einer Funktion zurückgeben?

Frage 17.9: Kennt jemand ein Programm das Pascal oder Fortran (oder LISP, Ada, awk, "altes C" (K&R), ...) nach C übersetzt?

Frage 17.10: Ist C++ eine Obermenge von C? Kann ich einen C++ Compiler benutzen um C Programme zu kompilieren?

Frage 17.11: Ich brauche einen Crossreference-Generator (Beautifier, Pretty Printer) für C.

Frage 17.12: Wo sind all die erwähnten Public-Domain Programme erhältlich?

Frage 17.13: Wann findet der nächste "International Obfuscated C Contest" (IOCC) statt? Wie bekommt man eine Kopie früherer und gegenwärtiger Sieger?

Frage 17.14: Warum gibt es in C keine verschachtelten Kommentare? Wie kann ich Programmtext, der Kommentare enthält, auskommentieren? Darf ich Kommentare in Stringkonstanten einfügen?

Frage 17.15: Wie kann man den ASCII Wert eines Zeichens und umgekehrt das passende Zeichen zu einem ASCII Wert rausfinden?

Frage 17.16: Wie programmiert man Bit-Sets und/oder Bit-Arrays?

Frage 17.17: Wie kann man am effizientesten die Zahl der gesetzten Bits in einer Variablen ermitteln?

Frage 17.18: Wie kann man dieses Programm effizienter machen?

Frage 17.19: Sind Zeiger wirklich schneller als Arrays? Wie sehr verlangsamen Funktionsaufrufe die Programmausführung? Ist ++i schneller als i= i + 1?

Frage 17.20: Warum stürzt dieser Code ab:

	char *p = "Hello, world!";
	p[0] = tolower(p[0]);

Frage 17.21: Mein Programm stürzt ab, bevor es überhaupt die erste Zeile ausführt (Wenn man es mit einem Debugger untersucht bricht das Programm vor der ersten Zeile von main ab).

Frage 17.22: Was bedeuten "Segmentation Violation" und "Bus Error"?

Frage 17.23: Hat jemand ein Programmpaket um den Compiler zu überprüfen?

Frage 17.24: Wo bekommt man eine YACC Grammatik für C her?

Frage 17.25: Ich benötige Code um mathematische Ausdrücke zu parsen und auszuwerten.

Frage 17.26: Wo bekommt man eine Routine für den "ungefähren" Vergleich von 2 Strings her, die ähnliche, aber nicht unbedingt exakt gleiche Strings erkennt.

Frage 17.27: Wie kann man den Wochentag aus einem gegebenen Datum herausfinden?

Frage 17.28: Ist das Jahr 2000 ein Schaltjahr gewesen? Ist (year % 4 == 0) ein zuverlässiger Test für ein Schaltjahr?

[ Inhalt ][ Index ][ ZurÜck ][ Weiter ]


[ FAQ Logo ]   © 1997-2004 Jochen Schoof (joscho@bigfoot.de)
Diese Version wurde am 14. März 2004 erzeugt. Sie wird zukünftig nicht weiter gepflegt.