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?


Anmelden zum Antworten