konstanter String



  • 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