Was macht dieses Prog.?
-
Wird überarbeitet
-
Ich kann dir sagen, was es nicht tut, nämlich kompilieren:
foo.c:15: Fehler: Rückgabetyp von »main« ist nicht »int«
-
Hallo,
Es interessiert ob man einen Code gut entziffern kann oder nicht!
natürlich nicht. Wenn es einen Preis dafür geben würde (so ab 10.000 Euro aufwärts) könnteste damit rechnen, dass sich jemand damit befasst. Bei solchen Variablennamen und seltsamen Einrückungen schalte ich meistens (freiwillig ab).
-
Ich kann dir sagen, was es nicht tut, nämlich kompilieren:
Code:
foo.c:15: Fehler: Rückgabetyp von »main« ist nicht »int«So ich hab das Programm verändert so das auch du es kompilieren kannst!
mfg hohesC
-
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <time.h> #include <math.h> #define ARRAY 4 #define SIZE 16 int rnd(); void seedrnd(void); int main() { int z,st,en,st1,i,j,x,y,p; char arr[SIZE];
Was denn nu C oder C++???
-
Was denn nu C oder C++???
Ist das wirklich ne Frage???
-
Ja.
-
Also wir sind hier im C Forum oder irre
ich mich da???
Was wird dann wohl hier Verkauft???
belegte Brötchen, Autos......?mfg hohesC
-
Um dir mal zu helfen.
Versuche doch mal unter -hohes C- ein Array mit einer Konstanten zu initilaisieren.
-
Um dir mal zu helfen.
Versuche doch mal unter -hohes C- ein Array mit einer Konstanten zu initilaisieren.hahahahahaha! Witz lass nach!
Um dir mal zu helfen#define SIZE 16
char arr[SIZE] ist das gleiche wie char arr[16]!!!
Die 16 die größe des Arrays wird mehrmals im Quellcode verwendet!
Sollt ich einmal die Größe ändern brauch ichs blos in der Präprozessor Anweisung ändern.gruß hohesC
(16 ist auch eine Konstante!!!)
-
#include <stdio.h> #define SIZE 26 int main() { char text[SIZE]="Versuchs du lieber mal!!!\0"; puts(text); return(0); }
-
Warum nicht
char text[SIZE]="Versuchs du lieber mal!!!";
oder noch besser
char text[]="Versuchs du lieber mal!!!";
?
-
Ja das ist in dem fall so aber in dem eigentlichen Prog. taucht die größe des
Arrays mehrmals auf und da ist #define SIZE 16 oder so nützlich!gruß hohesC
-
Heh. Der Code baut einen Buffer Overflow - auf die Art packst du gleich zwei \0 ans Ende des Strings, der dann 27 chars einnimmt. So ists richtig:
#define SIZE 26 /* ... */ char text[SIZE]="Versuchs du lieber mal!!!";
...oder noch besser gleich so:
char text[]="Versuchs du lieber mal!!!";
Aber prinzipiell hast du recht, dass der Präprozessor den Kram auf Textebene ersetzt und es in C gängige Praxis ist, Konstanten durch Präprozessor-Makros lesbarer darzustellen.
-
1. kommt bei
#include <stdio.h> #define SIZE 26 int main() { char text[SIZE]="Versuchs du lieber mal!!!\0"; puts(text); return(0); }
kein Fehler!!!!!!!!!!
2. muss ich die Grösse angeben weil ich zufallsbuchstaben reinschreibe!for(x=0;x<=(SIZE-1);x++) { z=rnd(); if((z>='a'&&z<='z')||(z>='A'&&z<='Z')) { arr[x]=z; } else { x--; } }
Aber wie gesagt wird der quelltext überarbeitet und steht deshalb gerade nicht zur Verfügung!!!!
gruß hohesC
-
Doch Fehler:
$ cat t.c #include <stdio.h> int main(void) { printf("%d\n", sizeof("Versuchs du lieber mal!!!\0")); return 0; } $ gcc t.c && ./a.out 27
Die Zeichenkette ist 27 chars lang, also reichen 26 nicht aus, also ein Buffer Overflow, also ein typischer Heisenbug.
-
Toll Hansi Hinterseer mein Compiler hats akzeptiert!
Nur weil dein Compiler \0 nicht als ein sondern als zwei chars ansieht!
dann tipe für dich 27 ein Mr.Schlaubergerbug
oder setz für \0 ein ' ' leerzeichen!
-
hohesC schrieb:
oder setz für \0 ein ' ' leerzeichen!
ein leerzeichen ist genausowenig 'nicht da' wie \0
belegen beide ein char (zuviel)
-
\0 ist nur ein Zeichen. Du hast aber zwei \0s an deinem String hinten dran.
Und wenn du nicht so ruppig wärst, hätte ich dir jetzt sowohl erklärt, warum das so ist, als auch, warum es nichts bringt, da ein Leerzeichen hin zu schreiben, als auch warum es nicht bedeutet, dass das richtig ist, wenn dein Compiler das so frisst.
-
Ist doch auch wurst ob 1 char zuwenig odernicht....
Sorry das ich so"ruppig" war!
0xdeadbeef = 11011110101011011101111011101111=?sag mir lieber was das für ne zahl ist?