"net send" zusammenstellen durch Programm
-
Hallo,
ich habe mir gerade ein Programm geschrieben, was mir eigentlich die Tipparbeit mit dem Befehl "net send" im lokalen Netzwerk abnehmen soll. Es funktioniert nicht. Es ist mir eigentlich schon peinlich dieses Problem hier vorzustellen, weil das Programm einfach lächerlich ist:#include <stdio.h> #include <stdlib.h> /* für: system() */ #define MAX_MESSAGE_LENGTH 1000 #define MAX_COMP_NAME_LENGTH 30 int main () { int i=0, c; char szCompName[MAX_COMP_NAME_LENGTH]; char szNachricht[MAX_MESSAGE_LENGTH]; char szBuffer[MAX_COMP_NAME_LENGTH + MAX_MESSAGE_LENGTH + 1]; printf ( "Hallo und herzlich willkommen bei \"netsendhelper\""); printf ("\nEscape beendet das Programm."); printf ("\n\nGeben Sie den Computernamen oder die IP-Adresse des Computers"); printf ( "\nan, zu dem Sie Nachrichten schicken wollen: "); while ((c=getchar()) != '\n' && i <= MAX_COMP_NAME_LENGTH) { szCompName = c; ++i; } szCompName[i] = '\0'; i=0; printf("\n\n\tDenken Sie daran, dass Sie Maximal 1000 Zeichen eingeben koennen\n\n"); do { printf("\n> "); for (i=0; i<=MAX_MESSAGE_LENGTH; i++) szNachricht[i] = NULL; i=0; while ((c=getchar()) != '\n' && i <= MAX_MESSAGE_LENGTH) { szNachricht[i] = c; ++i; } szNachricht[i] = '\0'; sprintf(szBuffer, "net send %s %s", szCompName, szNachricht); system (szBuffer); } while (szNachricht); /* erstmal nur ne Endlosschleife. Das löse ich aber später */ return 0; }
Wenn ich jetzt das Programm ausführe (geht auch wunderbar) kann ich noch den PC-Namen eingeben. Gebe ich dann eine Nachricht ein kommt: "Das Senden von Dateien wird nicht länger unterstützt. Sie erhalten weitere Hilfe, wenn Sie NET HELPMSG 3777 eingeben."
Warscheinlich sehe ich gerade nur den Wald für Bäumen nichtKann jemand mir die Augen öffnen?
MfG, the flyingCoder.
-
Geht "net send" ohne dein programm auch?
denn normalerweise ist nicht der code an diesem fehler schuld!
-
Xenon schrieb:
Geht "net send" ohne dein programm auch?
Ja, ich habe es extra noch einmal ausprobiert, als diese Fehlermeldung kam.
-
ALso an dieser Fehlermeldung ist meiner Meinung Nach definitiv nicht dein Code schuld sondern! Diese Fehlermeldung erscheint normalerweise immer dann wenn auf deinem PC der Net Send dienst deaktiviert ist!
-
for (i=0; i<=MAX_MESSAGE_LENGTH; i++) szNachricht[i] = NULL;
szNachricht ist 1000 element gross, also von 0 - 999. du überschreibst hier aber von 0 - 1000, also eins zuviel. Im Ram ist aber das szCompName Array direkt dahinter sodas du dessen erstes element auch überschreibts und somit dessen inhalt löscht.
Du kannst jetzt entweder das <= durch < ersetzten oder bei der Deklaration der Arrays eins draufzählen. Ich würde letztderes empfehlen, weil sonst auch deine Eingabeschleifen immer ein Zeichen zuviel eingeben lassen.
-
Cool, es funktioniert. newvet hatte recht. Es lag daran, dass ein Zeichen zuviel gelöscht wurde. Wenn man nichts eingibt, kommt wieder die Meldung - aber das ist ja egal. (Es ist gewesen, wie ich es befürchtet habe
, war doch irendwie klar (!?), dass ich so einen beschissenen Fehler gemacht habe.)
Ich danke hiermit noch einmal allen, die sich die Mühe gemacht haben, hier zu posten.
MfG, the flyingCoder.
-
Das Problem ist zwar eigentlich gelöst, aber es gibt noch zwei Sachen, die vielelicht wichtig sind.
1. Das nullsetzen von szNachricht kannst du dir komplett sparen
2. für szBuffer ist zu wenig Speicher reserviert. Überleg mal was passiert, wenn der Computername 30 Zeichen und die Nachricht 1000 Zeichen enthält (auch wenn es kaum vorkommen wird).
-
Deswegen verwendet man ja auch std::string, oder gehts hier um C *g*
MfG SideWinder
-
SideWinder schrieb:
Deswegen verwendet man ja auch std::string, oder gehts hier um C *g*
Als C-Fan kann man doch das hier machen:
typedef char * String;
Um mein Programm trotzdem zu perfektionieren:
/*(c) by flyingCoder :p */ #include <stdio.h> #include <stdlib.h> /* fuer system ()*/ typedef char * String; /* Oder würde das ein C++ Compiler nicht mögen :confused: */ int main (void) { String szCompName, szMessage; String szBuffer; printf ( "Hallo und herzlich willkommen bei \"netsendhelper\"."); printf ("\nEnter ohne zusätzlichen Text beendet das Programm."); printf ("\n\nGeben Sie den Computernamen oder die IP-Adresse des Computers"); printf ( "\nan, zu dem Sie Nachrichten schicken wollen: "); gets (szCompName); printf("\n\n"); do { printf("> "); gets (szMessage); if (szMessage[0] == '\0') break; sprintf(szBuffer, "net send %s %s", szCompName, szMessage); system (szBuffer); } while (1) ; return 0; }
Schön, oder?
Gruss,
flyingCoder.
-
Wenn ich den Computernamen eingebe und Enter drücke kommt eine "nette" Fehlermeldung: "Die Anweisung in "0x004013d1" verweist auf Speicher in "0xcccccccc". Der Vorgang "written" konnte nicht auf dem Speicher durchgeführt werden.
Klicken Sie auf "OK", um das Programm zu beenden.
Klicken Sie auf "Abbrechen", um das Programm zu debuggen. [OK/Abbrechen]"
Liegt das etwa daran, dass mein Speicher evt. kaputt ist?
-
...
typedef char * String; /* Oder würde das ein C++ Compiler
nicht mögen*/
int main (void)
{
String szCompName, szMessage;
String szBuffer;
...---> Autsch!!!
Jetzt hast du genau das Gegenteil von dem gemacht, was du machen solltest. Anstatt mehr Sepeicher zu reservieren, hast du jetzt gar keinen mehr reserviert und wenn man versucht in einen Speicherbereich zu schreiben, der einem nicht gehört, dann bringt Windows die tolle Fehlermeldung, die du beschrieben hast.
-
OMG
Und bitte jetzt keine Verbesserungen indem du in einem define auch noch malloc() aufrufst und den Speicher nicht mehr freigibst, spar dir die Arbeit :D.
MfG SideWinder
-
schuligung ...
Das mittypedef char * String;
war ein Beispiel aus meinem Kernighan/Ritchie.
-
Seite? Würd mich echt interessieren in welchem Zusammenhang die sowas schreiben :D.
MfG SideWinder
-
Ich vermute mal im Zusammenhang mit malloc() und realloc() *hoff*
...
-
SideWinder schrieb:
Seite? Würd mich echt interessieren in welchem Zusammenhang die sowas schreiben :D.
In der deutschen Ausgabe: S.140. Als Beispiel für "typedef".
Helft mir mal auf die Spünge: Was genau war nochmal "malloc ()"?flyingCoder.
-
Dynamische Speicherreservierung.
-
AJ schrieb:
Dynamische Speicherreservierung.
-
unsigned int anzchar = 0; char *buffer; //statische Speicherreservierung char buf[100]; //dynamische Speicherreservierung printf("Wie groß soll der Puffer sein? "); scanf("%ud", &anzchar); buffer = malloc(anzchar); printf("Bitte eine andere Größe wählen: "); scanf("%ud", &anzchar); buffer = realloc(buffer, anzchar);
Edit: unsigned int ist wohl sicherer