Warning in C-Programm



  • Hallo,
    ich habe ein kleines Programm geschrieben
    #include <stdio.h>
    #include <string.h>
    main () {
    char ip[100];
    int resultat,alles;
    printf("\nIP=\n");
    gets(ip);
    sprintf(alles, "net send %s hallo", ip);
    resultat = system(alles);
    }

    und dann sagt der Compiler:

    8 D:\C-Programme\oma.c [Warning] passing arg 1 of `sprintf' makes pointer from integer without a cast

    , und ich habe mal was von cast gehört, also ich glaube, dass ich den Typ von der Variblen ändern muss (oder so ähnlich), also vielleicht weis jemand, woran mein Programm hängt.
    Danke schon mal



  • Wie willst du den ganzen Text in einen int hineinbekommen?
    Deine Variable "alles" sollte schon auch ein char-Array sein.



  • 😃 Wie es regnet doch nicht? 😃



  • Waaah! Bist du wahnsinnig? IN einen uninitialisierten Pointer schreiben?!

    Der Fehler ist sehr viel einfacher - blackfog hat einfach die PArameter vertauscht. Das muss so aussehen:

    sprintf(ip, "net send %s hallo", alles)
    

    ...allerdings sollte "alles" dazu nach Möglichkeit auch initialisiert sein, sonst macht der system-Aufruf aller Wahrscheinlichkeit nach Mist.



  • @hohesC:
    Danke für das Beispiel, wie man's nicht macht. 😉
    Es geht doch nichts über Schreibzugriffe über uninitialisierte Zeiger.



  • 0xdeadbeef schrieb:

    Das muss so aussehen:

    Auch nett. Überschreibt das, was in ip eingelesen wurde, und schreibt einen int mit %s.



  • Whoops, der Fehler ist doch nicht ganz so einfach, fällt mir grad auf. Und ich hab mich böse verdacht, aber in einen uninitialisierten Pointer zu schreiben ist trotzdem böse. Ich schätze, du willst so was in der Art:

    #include <stdio.h>
    #include <string.h>
    main () {
      char command[100], ip_str[100];
      int resultat;
    
      printf("\nIP=\n");
      fgets(ip_str, 100, stdin);
    
      sprintf(command, "net send %s hallo", ip);
      resultat = system(command);
    }
    


  • Danke für die Antworten,
    aber irgendwie klappt des nicht so richtig, also die Warning Meldung is weg 🙂
    , aber an die IP senden tut er trotzdem nicht, also mein Code sieht jetzt so aus
    #include <stdio.h>
    #include <string.h>
    main () {
    char ip[100];
    int resultat,alles;
    printf("\nIP=\n");
    gets(ip);
    sprintf(ip,"net send %s hallo",alles);
    resultat = system(alles);
    }



  • Ne, das funzt nicht - da hatte ich mich böse verkuckt und nachher eine halbe Tonne Asche über mein Haupt gekippt. Beim zweiten dagegen wars nur ein Tipfeeler.

    Was du machen willst, ist ja folgendes:

    1. Ne IP einlesen
    2. Die in einen anderen String einbauen
    3. den durch system jagen.

    Also:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main() {
      char command[100], /* Buffer für das Kommando, das durch system soll*/
           ip_str[100];  /* Buffer für die IP */
    
      printf("IP =");    /* Prompt anzeigen*/
      fflush(stdout);    /* Sofortige Ausgabe erzwingen */
    
      if(fgets(ip_str, 100, stdin) == NULL) { /* Eine Zeile von der Konsole einlesen */
        puts("Fehler beim Einlesen!"); /* Fehlermeldung     */
        return -1;                     /* ...und raus hier. */
      }
    
      sprintf(command, "net send %s hallo", ip_str); /* Das Kommando zusammensetzen */
      return system(command); /* Kommando ausführen und den Rückgabewert zum eigenen machen */
    }
    


  • Also irgendwie klappt des nicht. Ich habe zwar keine Ahnung wieso, aber der macht immer noch nichts 😞 . Aber vielleicht fällt dir doch noch eine andere Lösung ein.



  • 0xdeadbeef:
    Dein Code ist fast korrekt. Allerdings nehme ich an, dass in ip_str noch das \n von der Eingabe drinnen steht.

    Und warum checkst du ob das fgets erfolgreich war? Du checkst das ja bei printf() auch nicht...



  • Beim fgets checke ich den Rückgabewert, weil ich nachher buf weiter benutzen will, und wenn der uninitialisiert ist, kann es zu seltsamen Effekten kommen. Ansonsten hast du recht, das \n steht am Ende noch drin, aber das ist ja leicht zu beheben:

    ip_str[strlen(ip_str) - 1] = 0; /* kein check nötig, wenn fgets hinhaut, steht in ip_str auch was drin */
    

    Ich weiß, dass das, wenn der buffer nicht lang genug für die ganze Zeile war, ein Zeichen wegschmeißt, aber da ne durchschnittliche IP in Stringform höchstens 15 Zeichen + Sentinel lang wird und der buffer 100 Zeichen lang ist, ist das in diesem Fall egal.



  • 0xdeadbeef schrieb:

    Beim fgets checke ich den Rückgabewert, weil ich nachher buf weiter benutzen will, und wenn der uninitialisiert ist, kann es zu seltsamen Effekten kommen.

    Checkst du auch jedes scanf(), getchar(), etc?

    IMHO ist es paranoid auf stdin/stdout Fehler zu testen - denn wenn stdin/stdout nicht klappen, dann ist sowieso etwas wesentliches kaputt.



  • Dazu sag ich nur:

    ./programm < datei
    

    In diesem speziellen Fall mag das egal sein, aber ich habs mir trotzdem angewöhnt und fahr damit eigentlich ganz gut.



  • 0xdeadbeef schrieb:

    Dazu sag ich nur:

    ./programm < datei
    

    In diesem speziellen Fall mag das egal sein, aber ich habs mir trotzdem angewöhnt und fahr damit eigentlich ganz gut.

    Warum testest du dann printf() nicht auch?

    Ich sag da nur:

    ./programm > datei
    


  • Naja - wenn das mit dem rausschreiben nicht hinhaut, steht im Zweifel nachher auf dem Bildschirm bzw. in der Datei Mist (oder halt nichts), aber ich hab keine korrupten Buffer auf dem Stack liegen, die mich nachher dazu veranlassen könnten, irgendwo ins Nirvana zu schreiben...



  • Ich kapier den Unterschied nicht: in beiden Fällen schlägt das Programm fehl.



  • Shade Of Mine schrieb:

    IMHO ist es paranoid auf stdin/stdout Fehler zu testen - denn wenn stdin/stdout nicht klappen, dann ist sowieso etwas wesentliches kaputt.

    Bei stdout geb ich dir (für Programme ohne besondere Robustheitsanforderungen) recht, aber denke bei stdin bitte an EOF.


Log in to reply