C Verständnisschwierigkeiten



  • Hallo zusammen,

    ich habe mich nach längerer Pause wieder meinem C-Programm gewidmet. Mittlerweile funktioniert es, leider gibt es einige Schönheitsfehler und es sind einige Fragen aufgetaucht, zu denen ich noch keine Lösung gefunden habe.

    Aber zunächst mein Code:

    cat ping.c

    #include <stdio.h>
    
    char ping(char *client) {
    
            FILE *stream;
    
            char s_command[ 150 ];
            sprintf( s_command, "ping %s", client );
    
                    stream = popen(s_command, "w");
    
                    pclose(stream);
    
            return(0);
    }
    

    cat nmblookup.c

    #include <stdio.h>
    
    char result[50];
    
    char nmblookup(char* client, char* winsx) {
    
            FILE *stream;
    
            char s_command[ 150 ];
            char buffer[40];
    
            sprintf( s_command, "nmblookup -U %s -R %s", winsx, client );
    
            stream = popen(s_command, "r");
    
            while ( fgets( buffer, 40, stream ) != NULL )
                    printf("%s", buffer);
    
            pclose(stream);
    
            sprintf(result, strtok( buffer, " "));
            return *result;
    }
    

    cat nping.c

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define version "1.01"
    #define wins1 "192.168.0.101"
    #define wins2 "192.168.0.102"
    
    // functions-header
    char nmblookup(char* client, char* winsx);
    char ping(char *client);
    
    // global vars
    char result[50];
    
    int main(int argc, char *argv[]) {
    
      void help() {
        printf("%s von Björn, 05.02.2008\n",basename(argv[0]));
    
                    printf(version);
    
        printf("usage: %s [-?] Clientname\n",basename(argv[0]));
        printf("\t-?/-h/--help : Print help information\n");
    
            return;
            }
    
            if ( argv[1] == NULL ) {
                    help();
                    return 1;
            }
    
            char *client = argv[1];
    
      printf("\033[31mDas folgende Gerät soll erreicht werden:\033[0m%s\n\n",client);
    
            nmblookup(client,wins1);
    
            ping(result);
            return 0;
    }
    
    #
    # Makefile
    #
    
    nping:          nping.o nmblookup.o ping.o
                    gcc nping.o nmblookup.o ping.o \
                            -o nping
    
    nping.o:        nping.c
                    gcc -c nping.c
    
    nmblookup.o:    nmblookup.c
                    gcc -c nmblookup.c
    
    ping.o:         ping.c
                    gcc -c ping.c
    
    clean:
            rm -f nping.o nmblookup.o ping.o
    

    Soo..nach welchem Stichwort muss ich suchen, wenn ich wissen möchte was "%s" und "%d" und so weiter bedeuten? Ich hätte gerne eine Auflistung gefunden, habe ich aber leider nicht.

    Es gibt beim kompilieren ein Warning:

    nmblookup.c:21: warning: passing argument 2 of ΓÇÿsprintfΓÇÖ makes pointer from integer without a cast
    

    Ich weiß nicht genau warum und bekomme diese Meldung nicht weg. Ein ähnliches Problem habe ich wenn ich 2 Strings aneinander ketten möchte. Ich würde gerne "basename(argv[0])" und version zusammenhängen, bekomme aber mit strcat das gleiche Warning oder eine Speicherzugriffsverletzung. Okay aber mit strncat habe ich es auch nicht hinbekommen.

    Das viel schlimmere Problem ist, das mir scheinbar "sprintf(result, strtok( buffer, " "));" eine Ausgabe erzeugt. Die möchte ich garnicht haben, ich möchte eigentlich lediglich die IP aus der Rückgabe vom nmblookup-Befehl haben und diese zurückgeben.

    Wenn ich das Programm ausführe:

    ./nping clientname
    Das folgende Gerät soll erreicht werden:clientname
    
    querying clientname on 192.168.0.101
    192.168.0.50 clientname<00>
    PING 192.168.0.50 (192.168.0.50) 56(84) bytes of data.
    64 bytes from 192.168.0.50: icmp_seq=1 ttl=128 time=3.91 ms
    64 bytes from 192.168.0.50: icmp_seq=2 ttl=128 time=0.254 ms
    

    Wie kann ich die Ausgabe von "querying clientname on 192.168.0.101
    192.168.0.50 clientname<00>" zumindestens unterdrücken? Ist sprintf die falsche Funktion?

    Nachdem es nun immerhin funktioniert, stellt sich für mich auch die Frage ob es optimal programmiert ist oder nicht.



  • Hallo,

    zuerst mal zu dieser Frage:

    Rainbow-Warrior schrieb:

    Es gibt beim kompilieren ein Warning:

    nmblookup.c:21: warning: passing argument 2 of ΓÇÿsprintfΓÇÖ makes pointer from integer without a cast
    

    In der Zeile 21 von bnblookup.c hast du einen Fehler gemacht:

    sprintf(result, "%s", strtok(buffer, " "));
    

    So müsste es richtig lauten.

    Gruß mcr

    PS: die andere Frage schaue ich mir später mal an.



  • Rainbow-Warrior schrieb:

    Wie kann ich die Ausgabe von "querying clientname on 192.168.0.101
    192.168.0.50 clientname<00>" zumindestens unterdrücken? Ist sprintf die falsche Funktion?

    In Zeile 17 von nmblookup.c gibst du die Ausgabe von nmblookup selbst
    aus. Wenn du das printf() dort löschst, sollte dies nicht mehr ausgegeben
    werden.

    Gruß mcr

    PS: um ehrlich zu sein, ist mir schleierhaft, wie das bei dir funktionieren
    konnte:

    In nping.c wird das Array result nie gefüllt. Somit müsste der ping-Aufruf
    einen Fehler zurückgeben. Merkwürdig!



  • Hi,

    vielen Dank für deine Antwort!!

    Okay habe sprintf von Zeile 17 auskommentiert, wenn ich nun das Programm ausführe geht es nicht mehr. Weil du natürlich recht hast und result in nping nicht gefüllt wird. Warum es mit dieser Zeile funktioniert hat, kann ich dir leider nicht sagen. Es ist mein erstes C-Programm!

    Also ich möchte es ja richtig machen, aber wenn ich versuche die Rückgabe der Funktion nmblookup in die Variable result zu schreiben, bekomme ich beim kompilieren einen Fehler:

    // functions-header
    char nmblookup(char* client, char* winsx);
    char ping(char *client);
    
    // global vars
    char result[50];
    
    int main(int argc, char *argv[]) {
    
    void help() {
            printf("%s von Bj÷rn, 05.02.2008\n",basename(argv[0]));
            printf(version);
            printf("usage: %s [-?] Clientname\n",basename(argv[0]));
            printf("\t-?/-h/--help : Print help information\n");
            return;
    }
    
    if ( argv[1] == NULL ) {
            help();
            return 1;
    }
    
    char *client = argv[1];
    
    printf("\033[31mDas folgende GerΣt soll erreicht werden:\033[0m%s\n\n",client);
    
            result = nmblookup(client,wins1);
    
            ping(result);
            return 0;
    }
    
    make
    gcc -c nping.c
    nping.c: In function main:
    nping.c:35: error: incompatible types in assignment
    make: *** [nping.o] Fehler 1
    

    Was mach ich falsch, es sind doch die erwarteten variablentypen oder nicht?



  • Rainbow-Warrior schrieb:

    Hi,

    // functions-header
    char nmblookup(char* client, char* winsx);
    
    // global vars
    char result[50];
    
    ...
    
            result = nmblookup(client,wins1);
    
    ...
    

    Was mach ich falsch, es sind doch die erwarteten variablentypen oder nicht?

    result ist nicht vom Typ char, sondern es ist ein Array vom Typ char.

    Damit du was lernst, gebe ich dir hier mal den berichtigten Code an:

    nmblookup.c

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "nmblookup.h"
    
    char* nmblookup(char* client, char* winsx) {
        FILE *stream;
        char s_command[150];
        char buffer[40];
    
        char *result = malloc(1024);  /* neu hinzufügen */
    
        sprintf(s_command, "nmblookup -U %s -R %s", winsx, client );
    
        printf("command: %s\n", s_command);   /* debug zeile */
    
        stream = popen(s_command, "r");
        while ( fgets( buffer, 40, stream ) != NULL );
        pclose(stream);
    
        sprintf(result, "%s", strtok( buffer, " "));
    
        /* hier müsstest du result noch auf Zulässigkeit überprüfen! */
        /* es kann ja sein, dass nmblookup nicht erfolgreich war     */
    
        printf("result: %s\n", result);  /* debug zeile */
    
        return result;
    }
    

    nmblookup.h

    #ifndef NMBLOOKUP_H
    #define NMBLOOKUP_H
    
    char* nmblookup(char* client, char* winsx);
    
    #endif
    

    ping.c

    #include <stdio.h>
    #include "ping.h"
    
    void ping(char *client) {
    
        FILE *stream;
        char s_command[ 150 ];
    
        sprintf( s_command, "ping %s", client );
        stream = popen(s_command, "w");
        pclose(stream);
    
        return;
    }
    

    ping.h

    #ifndef PING_H
    #define PING_H
    
    void ping(char *client);
    
    #endif
    

    nping.c

    #include <stdio.h>
    #include <stdlib.h>
    #include <libgen.h>
    
    #include "nmblookup.h"
    #include "ping.h"
    
    #define version "1.01\n"
    #define wins1 "192.168.0.101"
    #define wins2 "192.168.0.102"
    
    void help(char *prog) {
        printf("%s von Bjoern, 05.02.2008\n", basename(prog));
        printf(version);
        printf("usage: %s [-?] Clientname\n", basename(prog));
        printf("\t-?/-h/--help : Print help information\n");
    }
    
    int main(int argc, char *argv[]) {
        char *result;
        char *client;
    
        if ( argc != 2 ) {
            help(argv[0]);
            return 1;
        }
    
        client = argv[1];
    
        printf("\033[32mDas folgende Geraet soll erreicht werden:\033[0m %s\n\n", client);
    
        result = nmblookup(client, wins1);
    
        printf("result: %s\n", result);  /* debug zeile */
    
        ping(result);
        free(result);
    
        return 0;
    }
    

    Makefile

    #
    # Makefile
    #
    
    nping:          nping.o nmblookup.o ping.o
    		gcc -W -Wall -pedantic nping.o nmblookup.o ping.o -o nping
    
    nping.o:        nping.c
    		gcc -W -Wall -pedantic -c nping.c
    
    nmblookup.o:    nmblookup.c
    		gcc -W -Wall -pedantic -c nmblookup.c
    
    ping.o:         ping.c
    		gcc -W -Wall -pedantic -c ping.c
    
    clean:
    		rm -f nping.o nmblookup.o ping.o
    

    So, ich hoffe, du lernst da etwas draus.

    Gruß mcr

    PS: du brauchst nicht für jede Funktion eine eigene Datei erzeugen.


Anmelden zum Antworten