Der Martin: kennt sich jemand mit C aus?

Beitrag lesen

Guten Abend nochmal!

[Kommentar]

Wenn Du mit anderen Leuten zusammenarbeitest, [...] aber auch sowas nenne ich Pflicht.

Gut, wenn du es so siehst, stimme ich unbedingt zu.

for(int i=0;i<100;i++);
  {
  printf("Inner Loop\n");
  }

"Der gibt nix aus, woran liegt's?" war ungefähr die Frage.

Ey, ein Semikolon hinter einer for-Anweisung ist ja auch schon verdächtig. Auch wenn manche Programmierer -mich selbst eingeschlossen- bei kurzen Loops manchmal alles in die Klammer packen. Dann wäre das okay.
Aber das hat meiner Ansicht nach nichts mit der Frage zu tun, ob eine Klammer am Zeilenende oder am Zeilenanfang stehen sollte.

Dann wechsle Deinen Editor.
Nein, wirklich: Blöcke, Semantik im Allgemeinem, sollte ein Editor gut darstellen können, sonst taugt er nicht viel.

Ach so...? ich hab noch nie einen Editor mit Syntax-Highlighting oder sowas benutzt. Oder... doch, ja, aber das ist lange her. Und bei dem hab ich das ziemlich schnell wieder abgestellt, weil ich es nervig fand. Ansichtssache, da haben wir's wieder. ;)

char string[ANZ+1], c=(char)(0); // oder c = '\0'

Die Typen char und int sind zuweisungskompatibel, deswegen halte ich die Schreibweise '\0' eigentlich für unnötig kompliziert, genauso wie einen type cast zwischen int und char.

Ja, wenn das alles so einfach wäre ;-)

Das ist es auch!

So funktioniert das nur auf einem PC o.ä., wenn Du auf "exotischere" Platformen umschwenkst kannst Du damit ganz gewaltig auf die Schnauze fallen.

Ich habe auch schon Embedded-Anwendungen auf diversen µC's gebastelt. Ha, da war ein int noch 8bit wert!

Ein Byte ist nicht überall 8 Bit lang, ein int nicht überall 32 Bit, aber ein char entspricht einem Byte und ein Byte ist groß genug ein Zeichen der jeweiligen Umgebung zu halten:

Selbstverständlich. Der Auszug aus dem Standard, den du zitierst, sagt allerdings nichts zur char/int-Verwandtschaft. Ich kenne den Standard zwar nicht in der Theorie, aber aus der Anwendung. Und da sind nun mal char und int nichts weiter als zwei Varianten eines Integer-Grundtyps und somit zuweisungskompatibel.
Nur mit dem Vorzeichen muss man dann und wann aufpassen. Das kann man aber recht gut vermeiden, indem man -soweit möglich- unsigned-Typen verwendet. Oft kann man das sogar ohne Einschränkung machen.

Nebenbei: was ist mit dem Unterschied von uchar und char? Du kann sowas machen: char c = 'ä', aber was dabei rauskommt ist fraglich, wenn es nicht bereits eine Compilerwarnung bekommt.

Sag ich doch: Wenn ein Vorzeichen ins Spiel kommt, muss man aufpassen. Aber das Vorzeichen ist eh nur Illusion: Ein gesetztes MSB, das nur bei ein paar wenigen Operationen (>>-Operator, Ausgabe über eine der printf-Funktionen) überhaupt eine besondere Rolle spielt.

Arrayelemente (in diesem Fall chars), die bei der Initialisierung nicht explizit einen Wert erhalten, werden mit 0 belegt (oder '\0' oder NULL, je nachdem was dir am liebsten ist).

Nein, das stimmt wieder nicht.

Dein Auszug aus dem Standard beschreibt nur, was der Compiler daraus machen soll, wenn der Programmierer seine Variablen *nicht* explizit initialisiert.
Ich meine mich aber zu erinnern, dass es irgendwo eine Regel gibt, nach der strukturierte Datentypen (und dazu gehören ja auch Arrays) mit Nullwerten aufgefüllt werden, wenn sie *nur teilweise* initialisiert werden, so wie z.B.
unsigned long pp[40] = { 2, 1, 0 };
Hier werden die 37 nicht genannten Elemente implizit mit 0 belegt.

Also
   char string[ANZ+1] = "";
entspricht nach neuem Standard
   char string[ANZ+1];
   memset(string,'\0',ANZ+1);
was ich mir noch nicht so ganz angewöhnt habe, jedoch
   char string[ANZ+1];
alleine reicht dafür nicht.

Das hab ich auch nicht gesagt. Diese Zeile ist ja auch nur eine Deklaration, keine Initialisierung.

Bei der Enter-Taste ist das generell '\r' (oder 13 oder '\x0D').

Das sagt wer? Wo steht das? In meinem C-99 Standard steht nix davon.

Sorry, da bin ich jetzt ganz selbstverständlich von der PC-üblichen Implementierung ausgegangen. War wohl ein Satz mit X.

[scanf()] Das ist dann aber eines der Dinge auf die ich mich nicht unbedingt blind verlassen würde ;-)
(Geht auch erfahrungsgemäß in die Hose sowas)

Ja, das hat was...

Deshalb sollte der Anfänger Standard-C lernen und kein Windows-C, DOS-C, Linux-C oder was weiß ich alles.

Richtig. Die Spezialisierung auf eine bestimmte Plattform kommt erfahrungsgemäß von ganz allein im Lauf der Zeit.
Ciao,

Martin