char struct Zugriff seltsam? bitte um Hilfe



  • Hallo!
    Also ich habe folgendes:
    ein struct im headerfile:

    struct terminal{
    	char art [20];
    	char wert[20];	
    };
    

    und möchte dann im .c file so drauf zugreifen:

    struct terminal sym; 
    sym.art = "blabla"; //Wieso geht das nicht?
    

    Dies geht mit der Begründung nicht das es sich um inkompatible Typen in der Zuweisung handelt. Sind aber doch beides Strings? Wenn ich im struct einen int mache und so zugreife funktioniert es tadellos nur nicht mim string.

    Wie macht man sowas dann?
    mfg

    1metal3



  • sym.art ist ein char-Array, dem kann nichts zugewiesen werden. Deshalb brauchst du an dieser Stelle die Funktion strcpy() (oder ihre Verwandten) verwenden:

    struct terminal sym;
    strcpy(sym.art,"blabla");
    


  • herzlichen Dank für die rasche Hilfe, das wars!



  • Noch was:
    Möchte folgendes Vergleichen:

    strcmp(sym.wert,"return")==0)
    

    Also vergleiche ich einen String mit einem char array. Möchte nämlich eine if Abfrage wenn sym.wert gleich dem " ..." soll was passieren,
    danke
    mfg
    1metal3



  • Ich vergaß zu sagen das die If bei obrigen Vergleich nie betreten wird, also irgendwie vergleicht der das falsch den wenn ich sym.wert ausgeben entspricht es z.b dem "return" danke



  • Wird sym.art möglicherweise von der Tastatur eingelesen? Dann könnte noch ein \n drankleben, was man bei der Ausgabe nicht sieht, beim Vergleich störts dann aber.

    Ansonsten spricht nichts dafür dass strcmp Probleme damit hat "return" und "return" auseinanderzuhalten 😉



  • nein sym.art wir nicht von der tastatur eingelesen:

    folgendes funktioniert:

    char a [20] = "return"; 
    if(strcmp(a,"return")==0){
    
    }
    

    wenn ich aber das gleiche mit dem sym.wert mache was aber im struct auch ein char wert [20] ist geht es nicht:

    if(strcmp(sym.wert,"return")==0){
    
    }
    

    musss man anderes umgeben wenn sich das char array im struct verbirgt?



  • Ohne mehr Code kann man nur raten. Ich rate: Der Fehler ist nicht strcmp().



  • ok hier mal ein code:
    also Token.h

    #ifndef TOKEN_H_
    #define TOKEN_H_
    struct Token{
    	char art [20];
    	char wert[20];	
    };
    #endif /*TOKEN_H_*/
    

    und hier das c file:

    #include <stdio.h>
    #include <stdlib.h>
    #include <stdbool.h>
    #include <string.h>
    #include "Token.h"
    
    struct Token sym;
    
    int main(){
    	printf("%s\n","Vergleichstest");
    	sym.wert[0]='r';
    	sym.wert[1]='e';
    	sym.wert[2]='s';
    	sym.wert[3]='u';
    	sym.wert[4]='l';
    	sym.wert[5]='t';
    	printf("%s\n",sym.wert); //gibt result aus ! 
    
    	//strcpy(sym.wert,"return"); // wenn ich das im code lasse funktioniert es !
    
    	if(strcmp(sym.wert,"return")==0){
    		printf("%s\n","im if");	
    	}
    
    return 0;	
    }
    

    wenn ich dem sym.wert die zeichen mit [] zuweise funktioniert der vergleich nicht. Leider bekomme ich von der software die zeichen nur einzeln daher. Wenn man hingegen mit strcpy den wert in sym.wert hineinkopiert geht der vergleich, was ist hier los?
    danke



  • result != return
    sym.wert hat bei dir doch verschiedene strings, je nach methode...



  • sorry da hab ich mich jetzt in der eile verschrieben sollte nicht result heißen, hm es muss wohl wo anders der hacken sein, wenn ich nicht mehr weiter komm meld ich mich nochmal danke euch für die prompte hilfe !



  • Du musst die Zeichenkette auch (wie es strcpy auch tun würde) mit 0 abschließen:

    sym.wert[6] = '\0'; // man könnte auch 0 schreiben aber so sieht man sofort was gemeint ist
    


  • LordJaxom schrieb:

    Du musst die Zeichenkette auch (wie es strcpy auch tun würde) mit 0 abschließen:

    sym.wert[6] = '\0'; // man könnte auch 0 schreiben aber so sieht man sofort was gemeint ist
    

    Sollte bei dem Beispiel aber nicht das Problem sein, da die globale Struktur sym ja nach den bekannten Regeln initialisiert wird.
    Aber ist auch egal, wer nicht in der Lage ist den richtigen Code zum Problem zu posten... 🙄



  • sym.wert[6] = '\0';
    

    vielen Dank das hat dem String zum Vergleichen also gefehlt.

    @Tim
    Hast dich wohl noch nie verschrieben was.

    An die andren Danke für die Hife hier.



  • 1metal3 schrieb:

    @Tim
    Hast dich wohl noch nie verschrieben was.

    Sich in normaler Sprache zu verschreiben ist nicht das Problem, das menschliche Gehirn ist intelligent genug das zu korrigieren. Bei einem programmiertechnischen Problem ist das total anders. Ein Compiler verzeiht dir sowas nicht. Nicht zuletzt deswegen hat ein langjähriges Mitglied hier einen sehr wichtigen Hinweis gegeben:
    http://www.c-plusplus.net/forum/viewtopic-var-p-is-988781.html#988781

    Und weil du eben deinen Code falsch abgeschrieben hast, sind es jetzt 12 anstatt nur 2 Beiträgen. Aber das ist nicht das Problem. Dafür sind wir ja da...



  • @Tim
    Ich habe versucht den langen Programm Code nicht zu posten um die Übersichtlichkeit nicht zu verlieren. Deswegen habe ich schnell obrigen Code geschrieben und mich dabei vertippt. Das tut mir leid 🙂

    trotzdem danke für die überaus rasche und freundliche Hilfe



  • Was mich aber interessieren würde: Aus welchen Buch, Tutorial stammt der Code?

    Scheint ja um Compilerbau zu gehen 🙂



  • Leitfaden is das Buch Compilerbau vom Wirth. (allerdings ist da nur Oberon drin)


Anmelden zum Antworten