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";oderstring 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 durchstrcpyersetzen...
-
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 durchstrcpyersetzen...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
strlenconstexpraus 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
strlenconstexpraus 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
strlennoch nicht zur Compilezeit bekannt ist. Das ist bei einem Array auf dem Stack notwendig.