konstanter String



  • Hallo,

    char* x="Mein String";
    
    x[0]='A'
    

    //Zugriffsverletzung beim Schreiben

    Hat es einen Grund warum der String constant ist ?



  • Literale sind immer konstant! Das String-Literale implizit in ein char* umgewandelt werden, ist leider eines dieser hässlichen C-Erbstücke. Wenn du die Warnungen bei deinem Compiler aktivierst, dann sollte er dich aber auf das Problem hinweisen.

    Wenn du eine Kopie haben willst, die du bearbeiten kannst, dann mach

    char x[] = "Mein String";
    x[0] = 'A';
    


  • String-Literale werden vom Compiler in einem schreibgeschützten Speicherbereich abgelegt - auch wegen der dadurch möglichen Optimierungen. Und die meisten Compiler sollten auch eine Warnung ausgeben, daß die Zuweisung zu einem nicht-konstanten char-Zeiger Probleme bringt.

    PS: mit char x[]="Mein String"; oder string x="Mein String"; hättest du keine Probleme bekommen 😉



  • Wieso bekomme ich unten einen fehler ?

    void commentdelete(char x[])
    {
       int i,j;
       char tmp=new char[strlen(x)];
    
       for(i=0;x[i]!=0;i++) tmp[i]=x[i];
       tmp[i]=0;
    
       for(i=0,j=0;tmp[i]!=0;i++,j++)
       {
    
    	   x[j]=tmp[i];  // hier Zugriffsverletzung
    
       }
    
    }
    


  • Erstens dürfte schon die Zeile 7 Probleme bereitet haben, weil du keinen Speicherplatz für den Null-Terminator bereitgestellt hast.
    Zweitens: Was hast du denn dieser Funktion übergeben? Bei der Angabe von Parametertypen ist "char x[]" und "char* x" gleichbedeutend.
    Und drittens: Du solltest dir angewöhnen, mit std::string zu arbeiten 😉

    (gehe ich recht in der Annahme, daß der Autor deines Leerbuches die Initialien J.W. hat?)



  • Aber wie soll ich denn den String übergeben ?

    PS: nee das Lehrbuch ist nicht von Jürgen Wolf 🙂 (Quelle : amazon )



  • Na wie schon, als string natürlich 😃

    void commentdelete(std::string& x)
    {
      ...
    }
    

    (mit der String-Klasse solltest du dich sowieso intensiver beschäftigen)



  • ich will aber ein char array verwenden denn in C gibt es ja kein string



  • char tmp = new char[strlen(x)];
    

    Das compiled bei dir ? :o



  • blurry333 schrieb:

    ich will aber ein char array verwenden denn in C gibt es ja kein string

    Du postest hier aber im C++ forum und nicht im C-Forum....



  • cvcv schrieb:

    blurry333 schrieb:

    ich will aber ein char array verwenden denn in C gibt es ja kein string

    Du postest hier aber im C++ forum und nicht im C-Forum....

    In C gibt es auch kein new 😋



  • kjhk schrieb:

    cvcv schrieb:

    blurry333 schrieb:

    ich will aber ein char array verwenden denn in C gibt es ja kein string

    Du postest hier aber im C++ forum und nicht im C-Forum....

    In C gibt es auch kein new 😋

    True ^^ Aber zumindestens ein Äuqivalent. Naja, solange man keine Klassen mit benutzt.



  • ich muss einfach einen nicht konstanten String im main übergeben

    char x[100]; int i;
    char* tmp="Das ist /*ein Kommentar*/ ein Hund";
    
    for( i=0;tmp[i];i++) x[i]=tmp[i];
    x[i]=0;
    

    Wie kann man denn noch einen non constant string anlegen ?
    Ich muss ja erst in einer Schleife alles rüberkopieren.
    Das ist mir zu aufwändig



  • blurry333 schrieb:

    ich muss einfach einen nicht konstanten STring im main übergeben

    char x[100]; int i;
    char* tmp="Das ist /*ein Kommentar*/ ein Hund";
    
    for( i=0;tmp[i];i++) x[i]=tmp[i];
    x[i]=0;
    

    Wieso deklarierst du i nicht um for -Kopf? Und Kommentare innerhalb von Strings gibt es nicht. Und die Schleife kann man gut durch strcpy ersetzen...



  • EOutOfResources schrieb:

    blurry333 schrieb:

    ich muss einfach einen nicht konstanten STring im main übergeben

    char x[100]; int i;
    char* tmp="Das ist /*ein Kommentar*/ ein Hund";
    
    for( i=0;tmp[i];i++) x[i]=tmp[i];
    x[i]=0;
    

    Wieso deklarierst du i nicht um for -Kopf? Und Kommentare innerhalb von Strings gibt es nicht. Und die Schleife kann man gut durch strcpy ersetzen...

    Weil er anscheinend in C programmieren will und da muss man Variablen in der Regel am Blockanfang deklarieren.

    Wenn wir uns schon auf C-Niveau befinden:

    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
    	char x[100];
    
    	const char *tmp="Das ist /*ein Kommentar*/ ein Hund"; 
    
    	strcpy(x, tmp);
    
    	printf("%s\n", x);
    }
    

    Und was hast du davon? Nichts. Lern lieber C++...



  • In C++:

    #include <string>
    int main()
    {
      std::string foo("Ich bin ein Text");
      std::string bar(foo + ", den man mit c_str in einen CString umwandeln kann");
    }
    

    Sieht doch logischer und schöner aus, nicht?



  • #include <string.h>
    
    int main()
    {
        const char* const_string = "Hallo";    
        char non_const_string[30];
    
        strcpy(non_const_string,const_string);
    
        non_const_string[1] = 'e';
    
        return 0;
    }
    

    [Edit] editiert nach EOutOfResources' Hinweis.



  • Gugelmoser schrieb:

    #include <string.h>
    
    int main()
    {
        const char* const_string = "Hallo";
        const int size = strlen(const_string) +1;
        
        char non_const_string[size];
        strcpy(non_const_string,const_string);
        
        non_const_string[1] = 'e';
        
        return 0;
    }
    

    Du denkst, dass strlen constexpr aus C++0x drauf hat, aber leider nicht...



  • Oder wenn es ein Array sein muss...

    #include <vector>
    #include <iostream>
    #include <string>
    
    int main()
    {
    	std::string tmp= "Das ist /*ein Kommentar*/ ein Hund";
    
    	std::vector<char> x(tmp.begin(), tmp.end());
    
    	x.push_back(0); // std::string hat keine Nullterminierung, also manuell eine anfügen
    
    	std::cout << &x[0] << std::endl;
    
    	return 0;
    }
    

    bzw.

    #include <vector>
    #include <iostream>
    #include <string>
    
    int main()
    {
    	const char *tmp= "Das ist /*ein Kommentar*/ ein Hund";
    
    	std::vector<char> x(tmp, tmp + strlen(tmp));
    
    	x.push_back(0); // Alternativ + 1 bei zweiten Parameter oben
    
    	std::cout << &x[0] << std::endl;
    
    	return 0;
    }
    


  • EOutOfResources schrieb:

    Gugelmoser schrieb:

    #include <string.h>
    
    int main()
    {
        const char* const_string = "Hallo";
        const int size = strlen(const_string) +1;
        
        char non_const_string[size];
        strcpy(non_const_string,const_string);
        
        non_const_string[1] = 'e';
        
        return 0;
    }
    

    Du denkst, dass strlen constexpr aus C++0x drauf hat, aber leider nicht...

    Das ist zumindest ein Feature, welches der GCC beherrscht. Der VC tut es eher nicht. 😉


Anmelden zum Antworten