Problematik "Parameter"

und noch ein Problem

Code:
/*****************************************************************************************
    FILE : shutdown.c

    VERSION     AUTOR           DATUM       BEMERKUNG

    USED BY
    FIRMA  C-Kurs / Grundlagen
    
    BESCHREIBUNG
    Dieser Batch ermoeglicht das Runterfahren oder Neustarten eines Computers in ihrem
    Netzwerk ohne jegliche Konsolenkenntnisse.
*****************************************************************************************/
// Import
#include <stdlib.h>
#include <stdio.h>
// Konstanten
#define G
// Variablen 
char    Ip_name[16];             // IP-Adresse oder Computername       
char    Cmd[256] = "SHUTDOWN ";  // Variable welche den Shutdownbefehl enthält 
int     Eingabe_menu;            // Eingabe des Gewünschten schrittes  
int     Menu_abfrage;            // Abfrage sicherstellen Ja oder Nein 
int     Counter = 10;            // Counter um bei Falscheingabe die Zeit zu vertögern

  //Hauptprogramm
  int main() {
  system(); //Titel in der Konsole
  main:
       
  //Anzeige Verbesserungen
  system("cls");           //Leert den Bildschirm*/
  system("Color E");       //Der Text wird nun in gelb ausgegeben*/
  
  //Bildschirmausgabe
  printf("Dieser Batch ermoeglicht das Runterfahren oder Neustarten eines Computers\n");
  printf("in ihrem LAN.\n\n");

  //Auswahlmenu 
  printf("Auswahlmenu\n");
  printf("-----------\n");
  printf("[1] --- /i 		Ermoeglicht eine Grafische Oberflaeche\n\n");
  printf("[2] --- /s 		Herunterfahren\n\n");
  printf("[3] --- /s /c /t xxx 	Herunterfahren, Grund, Zeit in Sekunden\n\n");
  printf("[4] --- /r		Neustart\n\n");
  printf("[5] --- /r /c /t xxx 	Neustart, Grund, Zeit in Sekunden\n\n");
  printf("[6] --- /a		Abbrechen des Herunterfahren oder Neustartes\n\n");
  printf("[7] --- Deinstallation  Loescht alle Programmdateien\n\n");
  printf("[0] --- EXIT		Beendet das Programm\n\n\n");
  printf("Waehlen sie [1], [2], [3], [4], [5], [6], [7] oder [0]\n\n");
  printf("Eingabe = ");
    
  //Eingabe des gewünschten Schrittes 
  scanf ("%i",&Eingabe_menu);
  
  //Abfrage zur Überprüfung ob die Eingabe kleiner als 7 ist
  if (Eingabe_menu <= 7) {

  //Sprungmarken zum gewünschten Punkt welche jedoch keine IP brauchen
           if (Eingabe_menu == 1) 
               goto one;
               if (Eingabe_menu == 7) 
                   goto seven;
                   if (Eingabe_menu == 0) 
                       goto zero;
                       }
  //Sprungmarke zum beginn, wegen falscher eingabe                     
  else { 
    goto main;   
  }
  //Sprungmarken zum gewünschten Punkt welche jedoch eine IP brauchen
      if (Eingabe_menu == 2 || 3 || 4 || 5 || 6)
  //Eingabe: IP-Adresse oder Computername 
       printf("\nGeben sie bitte die IP-Adresse oder den Computernamen ein: ");
        scanf("%s",&Ip_name);
         printf("\n%s\n\n", Ip_name);
          if (Eingabe_menu == 2) 
            system("SHUTDOWN /s /m \\%s"), Ip_name;
              if (Eingabe_menu == 3) 
                  goto three;
                  if (Eingabe_menu == 4) 
                      goto four;
                      if (Eingabe_menu == 5) 
                          goto five;
                          if (Eingabe_menu == 6)
                              goto six;
  goto end;
  //Sprungmarken 0,1 & 7
  zero:
  printf("0");
  //system(cmd 
  goto end;
  one:
  printf("1");
  goto end;
  seven:
  printf("7");
  goto end;
  
  //Sprungmarken 2 - 6
  two:
  printf("2");
  goto end;
  three:
  printf("3");
  goto end;
  four:
  printf("4");
  goto end;
  five:
  printf("5");
  goto end;
  six:
  printf("6");
  goto end;

  //Programmende & Kontrolle des Programmablauf
  end:              // Sprungmarke zum ende
  system("PAUSE");	// nur während Entwicklungsphase 
  return 0;
}

ist Fett angestrichen, wie kann das lösen, kann mir da jemand helfen
 
Zuletzt bearbeitet:
zyclop hat gesagt.:
Was macht das

Code:
 sizeof(cmd)-strlen(cmd)-1);
sizeof ist ein Operator der zur Kompilierzeit(!) die Größe (in Bytes) eines Datentyps bzw. einer Variablen ermittelt. Da cmd ein Array von chars ist und ein char genau ein Byte groß ist, ist die Größe von cmd 256 Bytes.

Die Funktion strlen ermittelt - wie der Name schon sagt - die Länge eines Strings. Die Länge wird festgestellt indem alle Zeichen vom Anfang an gezählt werden bis ein NUL Zeichen (das ist das Zeichen das den Wert 0 hat) auftaucht. Da ich in dem String "shutdown " gespeichert habe ist das zehnte Zeichen ein NUL und der String ist somit 9 Zeichen lang - es sind aber 10 Zeichen belegt!

Das heißt 256 - 9 - 1 = 246 Zeichen sind in dem String noch frei und können noch vollgeschrieben werden.

Übrigens solltest du die IP Adresse besser so einlesen (damit nicht versucht wird mehr Zeichen in ipaddr zu speichern als Speicher zur Verfügung steht):
C:
if (scanf("%15s", ipaddr) != 1) {
  /* Fehler beim Einlesen */
  exit(1);
}
Gruß
 
hab ich nun

schgugg

Code:
strncat(Cmd, Par_s, Par_m, Par_slash, Ip_name, sizeof(Cmd)-strlen(Cmd)-1);

jetzt sind es aber zuviele argumente

was soll ich nun machen
 
Kann ich das so machen das ich es aufteile und es erst in zwei schritten zusammen füge

z.b das die ersten drei ausdrücke in eine temp variable gespeichert werden und nachträglich noch die andern zugefügt werden
 
zyclop hat gesagt.:
hab ich nun

schgugg

Code:
strncat(Cmd, Par_s, Par_m, Par_slash, Ip_name, sizeof(Cmd)-strlen(Cmd)-1);

jetzt sind es aber zuviele argumente

was soll ich nun machen
Du kannst die Parameter einfach nacheinander zusammenbasteln - bzw. konkatenieren. Die Parameter die nicht dynamisch ermittelt werden würde ich gleich zu Anfang einfügen:
C:
strncat(Cmd, " /s /m \\\\", sizeof(Cmd)-strlen(Cmd)-1);
strncat(Cmd, Ip_name, sizeof(Cmd)-strlen(Cmd)-1);
Gruß
 
das fügt sie ja nicht zusammen...du setzt einfach zweimal die Zeichenketten zusammen, aber bringen tut es ja nichts weil diese zwei hälften zuerst noch zusammengesetzt werden müssen...
 
Warum soll das nichts bringen? (und warum probierst du es nicht einfach aus?)

Wenn am Anfang in Cmd "shutdown " drin steht, dann steht nach dem ersten strncat "shutdown /s /m \\" drin und nach dem zweiten dann "shutdown /s /m \\xxx.xxx.xxx.xxx".

Wo ist denn jetzt das Problem?

Gruß
 
Zurück