#include <cstring>
char* str0;
const char* str1 = "abc";
// assign str1 to str0
strcpy(str0, str1); // syntax correct, but run time error
str0 = str1; // syntax error, cannot convert const char* to char*
string n_str = str1;
str0 = n_str; // syntax error, cannot convert ...
cout << str0 << endl; // expected output: abc
I'd like to make str0 same as str1 while runtime(after compilation), I don't know how to do it. And for the case str0 = str1;
I don't understand why it won't work, because str0 points to nothing, while str1 points to a const string literal, so if I now make str0 point to what str1 is pointing to, it should be fine, but it is not. So it there any way to solve it?
std::string str0;
const std::string str1 = "abc";
// assign str1 to str0
str0 = str1;
cout << str0 << endl; // output: abc
If you insist on using C:
char* str0;
const char* str1 = "abc";
str0 = malloc(strlen(str1) + 1);
// if you use a c++ compiler you need instead:
// str0 = (char*) malloc(strlen(str1) + 1);
strcpy(str0, str1);
// and free after use
// if you use C++ this will not help much
// as pretty much any exception above will cause your code to get out of `free`,
// causing a memory leak
free(str0);
If you insist on using bad C++:
char* str0;
const char* str1 = "abc";
str0 = new char[strlen(str1) + 1];
strcpy(str0, str1);
// and delete after use
// this will not help much
// as pretty much any exception above will cause your code to get out of `delete`,
// causing a memory leak
delete(str0);
Please read about RAII to understand why all of the solutions with manual memory management are bad: cppreference , wiki
Let's look one issue at a time
strcpy(str0, str1);
strcpy copies the characters pointed by str1 into the memory pointed by str0. str1 points to "abc", but str0 doesn't point to anything, hence the runtime error. I would recommend using std::string everywhere so you don't have to manage the memory yourself.
str0 = str1;
str0 is of type char*, str1 is of type const char*. The const qualifier instructs the compiler to not allow data modification on that particular variable (way over simplified role of const, for more in-depth explanation use your favorite search engine and you should be able to find a bunch of articles explaining const). If you'd be able to assign the same pointer to str0 you'd break the const contract; str0 can be modifiable.
string n_str = str1;
This is valid because std::string overloads the assignment operator and accepts a const char pointer as the right hand value.
str0 = n_str;
n_str is of type std::string and str0 is char*, there's no overloaded operator that allows this. If you really want the raw point out of an std::string you can use the c_str() method and it will return you a const char* - I strongly advise against it, unless you have to pass it to a function that only accepts const char*.
Copying strings
is an expensive operation. But moving strings
from one place to another is efficient.
casts away the const
str0 = (char*) str1;
or use std::string
class template library for managing strings. std::string
owns the character buffer that stores the string value. characters are part of the string
object. cont char*
stores the address of such a character buffer but does not own it.
c_str
returns a const char*
that points to a null-terminated string. It is useful when you want to pass the contents.
std::string str1 = "abc";
char* str0;
strcpy(str0, str1.c_str());
printf(str0);
const
is part of the type, and as such, you can cast it "away". This is considered bad practice, but you should think of const
as a strong suggestion of the original programmer, not to modify it.
const char * str1 = "abc";
char * str2 = (char*) str1;
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.