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.