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.
