konstanter String



  • 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. 😉



  • kjljkl schrieb:

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

    Was ich damit sagen wollte, ist dass der Code nicht laufen sollte, da der Rückgabewert von strlen noch nicht zur Compilezeit bekannt ist. Das ist bei einem Array auf dem Stack notwendig.



  • EOutOfResources schrieb:

    kjljkl schrieb:

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

    Was ich damit sagen wollte, ist dass der Code nicht laufen sollte, da der Rückgabewert von strlen noch nicht zur Compilezeit bekannt ist. Das ist bei einem Array auf dem Stack notwendig.

    Stimmt, du hast natürlich recht, die Arraygröße muss hierbei eine Compiletime-Konstante sein, und bei mir war es eine Laufzeitkonstante.


Anmelden zum Antworten