Char einem Pointer zuweisen



  • Moin moin,

    folgendes Problem habe ich:

    Ich möchte gerne einen über die Konsole eingegeben Wert auslesen und einer char variable zuweisen.

    Ich übergebe die argumente an die pruefe_eingabe Funktion, wo das erste Argument überprüft werden soll.
    checkstring(p[1]) überprüft das Argument uf eine bestimmte Zeichenkette und gibt 0 oder 1, je nach Fehlervorkommen, aus.
    Wenn alles richtig war, soll es dem String das Argument übergeben.

    Problem ist nur, dass es nicht klappt und er mir nur Sonderzeichen in *string schreibt.
    Hat jemand ein idee?

    main(int argc, char *argv[]) {
      char string;
      pruefe_eingabe(argv,&string);
    }
    
    pruefe_eingabe(char *ptr, char *string) {
    
      if(!check_string(p[1]))
        printf("Falsche Dateinamen-Eingabe.\n");
      else {
        *string = p[i];
      }
    
    }
    

    MfG



  • Definiere deine Funktion pruefe_eingabe mal vor main.
    Beachte dann die Fehlermeldungen und Warnungen.

    main gibt übrigens immer ein int zurück.



  • craiten.t schrieb:

    Ich übergebe die argumente an die pruefe_eingabe Funktion, wo das erste Argument überprüft werden soll.

    Dann musst du das auch so machen wie beschrieben. Du übergibst aber das komplette char*-Array und nicht einen char*.
    Lies dir die Warnungen deines Compilers durch, die sind extra für dich da und der Compiler hat immer recht.



  • DirkB schrieb:

    Definiere deine Funktion pruefe_eingabe mal vor main.
    Beachte dann die Fehlermeldungen und Warnungen.

    main gibt übrigens immer ein int zurück.

    Du hast recht, aber ist ja nur ein plumpes Beispiel. Wollte meinen komplexen Code nun nicht posten. Und ja, die Funktion ist über der Main 😉

    Wutz schrieb:

    Dann musst du das auch so machen wie beschrieben. Du übergibst aber das komplette char*-Array und nicht einen char*.
    Lies dir die Warnungen deines Compilers durch, die sind extra für dich da und der Compiler hat immer recht.

    Die Warnmeldungen kann ich leider nicht so ganz nachvollziehen.
    Diese sagt mir nun in Zeile 11:
    "assignment makes integer from pointer without a cast".
    😕



  • Der Fehler besagt, dass der Compiler eine nicht von dir vorgenommene Typumwandlung vornimmt.
    Du benutzt zwar p[i], aber in deinem Code ist diese nicht ersichtlich.
    Liste doch mal bitte deinen ganzen Code auf.

    Edit:
    Du kannst außerdem auf die einzelnen Elemente der Argumente mit

    pruefe_eingabe(argv[x],&string);

    zugreifen.

    argc solltest du verwenden um vorher zu überprüfen wieviele Argumente übergeben wurden. Wenn du nur den ersten ausließt kannst du direkt mit

    pruefe_eingabe(argv[1],&string);

    ohne überprüfen loslegen.



  • craiten.t schrieb:

    Du hast recht, aber ist ja nur ein plumpes Beispiel. Wollte meinen komplexen Code nun nicht posten. Und ja, die Funktion ist über der Main 😉
    ...
    Die Warnmeldungen kann ich leider nicht so ganz nachvollziehen.
    Diese sagt mir nun in Zeile 11:
    "assignment makes integer from pointer without a cast".
    😕

    Dein Beispiel ist aber nicht vollständig.
    Du hast zwar ptr nimmst dann aber p[].
    Du hast eine char Variable, die du string nennst (blöde Namenswahl)

    Woher sollen wir wissen, was du noch vergessen hast.

    Wenn du deinen kleinen Code fehlerfrei (auch ohne Warnungen) übersetzen kannst, hast du deinen Fehler auch gefunden.



  • Ich bitte vielmals um Entschuldigung, der Code wie er nun ist, habe ich nun überarbeitet:

    main(int argc, char *argv[]) {
      char string;
      if(pruefe_eingabe(argv,&string))
        printf("String okay");
    }
    
    pruefe_eingabe(char *p, char *string) {
    
      if(!check_string(p[1]))
        printf("Falsche Dateinamen-Eingabe.\n");
        return 0;
      else {
        *string = p[i];
      }
      return 1;
    }
    

    Fehlerabfraen, wie das abfangen von zu wenigen eingaben, habe ich bereits im code integriert. Alles ist da, dieses sollte nur ein beispiel bieten, da der code recht komplex ist. oder fehlt etwas am code zum verständnis?

    Der Fehler besagt, dass der Compiler eine nicht von dir vorgenommene Typumwandlung vornimmt.
    Du benutzt zwar p[i], aber in deinem Code ist diese nicht ersichtlich.
    Liste doch mal bitte deinen ganzen Code auf.

    Hm reicht das mit dem code?
    Also es ist mir klar, dass ich da nun irgendwas Casten soll, aber warum, bzw. warum kann ich einn Pointer nicht casten oder ist das garnicht möglich?



  • Du hast dieses kleine Programm nicht compiliert. 😡
    Mach es und beseitige alle Fehler und Warnungen.

    Dir ist klar, das argv vom Typ char** ist?
    Du weißt wofür Funktionsprototypen da sind?



  • Funktionen sollten außerdem vor der main-Methode definiert/implementiert werden.

    Edit: DirkB war schneller! 😉



  • Ups bitte nochmals um Entschuldigung.
    Hab es auch ttal übersehen, dass es ein doppelpointer sein muss:

    pruefe_eingabe(char **p, char *string) {
    
      if(!check_string(p[1])) {
        printf("Falsche Dateinamen-Eingabe.\n");
        return 0;
      } else {
        *string = p[1];
      }
      return 1;
    } 
    
    main(int argc, char *argv[]) {
      char string;
      if(pruefe_eingabe(argv,&string))
        printf("String okay");
    
      return 0;
    }
    

    jetzt steht es auch da, wie es in meinem code steht und nun kommt aber immernoch die selbe Fehlermeldung.



  • pruefe_eingabe(char **p, char *string) {
    
      if(!check_string(p[1])) {
        printf("Falsche Dateinamen-Eingabe.\n");
        return 0;
      } else {
        *string = p[1]; //Das sind unterschiedliche Datentypen!
      }
      return 1;
    }
    


  • Also p ist ein Doppelpointer (char**)
    Und string ist ein einfacher Pointer (char*)

    Was ist jetzt p[1] für ein Typ?
    Durch die Klammern hast du ein * weg, damit hast du noch ein char*
    Und was ist *string für ein Typ? *string ist wie bei der Definition angegeben ein char (nix Pointer).

    Da steht also

    char = char*;
    

    char ist ein Integer-Typ, char* ist ein Pointer-Typ
    Jetzt nochmal die Fehlermeldung:

    "assignment makes integer from pointer without a cast"

    Oder Dank Google-Übersetzter:
    "Zuweisung erzeugt Ganzzahl von Zeiger ohne Typkonvertierung"

    Was jetzt falsch ist weiß ich nicht, denn ich weiß ja nicht was du machen willst:
    a) in string soll der erste Buchstabe von argv[1] stehen (weil string vom Typ char ist)
    b) string soll auf argv[1] zeigen, weil da der gültige Dateiname drin steht. (weil string string heißt)



  • DirkB schrieb:

    Was jetzt falsch ist weiß ich nicht, denn ich weiß ja nicht was du machen willst:
    a) in string soll der erste Buchstabe von argv[1] stehen (weil string vom Typ char ist)
    b) string soll auf argv[1] zeigen, weil da der gültige Dateiname drin steht. (weil string string heißt)

    Das bezieht sich jetzt auf die Variable in main.



  • Ziel des Programmes soll sein, das komplette Argument wie z.b. "datei.gif" in char string zu speichern, so dass ich es in der main verwenden kann.



  • Was soll der Quatsch?
    Erstens kann man "blabla" nicht in einem char speichern (auch nicht, wenn man die char - Variable blödsinnigerweise mit 'string' benamst), zweitens steht Dir das doch sowieso schon in main zur Verfügung in argv[1].



  • Die dateibenennung sollte jetzt doch mal zweitrangig sein. ich kann den char string nun auch char zeichenkette nennen...

    Das grundlegende ist ja, dass ich eine Lösung brache um Problem, wie es DirkB schon richtig erkannt hat.
    Der komplette name soll in char string gespeichert werden.



  • Belli meinte nicht die Dateibennenung sondern den Variablennamen.
    Es bringt auch nichts, wenn du das Zeichenkette nennst, das ist es nämlich nicht.

    Ein char hat Platz für ein (in Zahlen 1) Zeichen und nicht mehr (egal wie du es nennst).

    Darum verwirrst du dich und andere, wenn du die Variable string oder Zeichenkette nennst, wenn sie kein Array oder Zeiger ist.

    Ein char wird komplett anders behandelt als ein char* bzw. char[].

    Lösung:

    char *pruefe_eingabe(char **p) { 
    
      if(!check_string(p[1])) {
        printf("Falsche Dateinamen-Eingabe.\n");
        return NULL;
      } else {
        return p[1];
      }
    }
    
    int main(int argc, char *argv[]) {
      char *string;
      if(string = pruefe_eingabe(argv))
        printf("String okay");
    
      return 0;
    }
    

    besser:

    char *pruefe_eingabe(char *p) { 
    
      if(!check_string(p) {
        printf("Falsche Dateinamen-Eingabe.\n");
        return NULL;
      } else {
        return p;
      }
    }
    
    int main(int argc, char *argv[]) {
      char *string;
      if(string = pruefe_eingabe(argv[1]))
        printf("String okay");
    
      return 0;
    }
    

    Kürzer:

    int main(int argc, char *argv[]) {
      char *string = NULL;
    
      if(argc > 1 && !check_string(argv[1]))
      { string = argv[1]; 
        printf("String okay");
      }
    
      return 0;
    }
    


  • craiten.t schrieb:

    Das grundlegende ist ja, dass ich eine Lösung brache um Problem, wie es DirkB schon richtig erkannt hat.
    Der komplette name soll in char string gespeichert werden.

    Wie gesagt, der komplette Name steht bereits in main als argv[1] zur Verfügung. Ansonsten gebe ich jetzt hier auf ...


Anmelden zum Antworten