char*改string
时间: 2023-07-31 15:08:04 浏览: 64
将char*转换为string可以使用string的构造函数或赋值运算符。例如:
```c++
char* cstr = "Hello World";
string str1(cstr); // 使用构造函数
string str2 = cstr; // 使用赋值运算符
```
注意,使用构造函数时需要保证cstr指向的内存空间已经被分配,并且以NULL结尾。如果不确定cstr是否符合条件,可以使用以下代码:
```c++
char* cstr = "Hello World";
string str(cstr ? cstr : "");
```
这样可以避免在cstr为NULL时出现程序崩溃。
相关问题
#include <iostream> #include <cstring> using namespace std; char *ReplaceString(char *str, char *s1, char *s2); int main() { char str[100], s1[10], s2[10]; cin >> str >> s1 >> s2; char *result = ReplaceString(str, s1, s2); cout << result << endl; return 0 ; } char *ReplaceString(char *str, char *s1, char *s2) { /********* Begin *********/ char *a,*b,*c; a=str; b=s1; c=s2; while(*str) { strtok(a,b); strcpy(b,c); } /********* End *********/ }这段代码怎么修改
这段代码存在一些问题,需要进行修改:
1. 在函数`ReplaceString`中,需要将替换后的字符串返回给主函数,因此需要定义一个新的字符数组,用于存储替换后的字符串,并在函数末尾将其返回。
2. 在`while`循环中,需要将`strtok`的返回值赋给`a`,否则`a`的值不会发生改变,导致替换失败。
3. 使用`strcpy`函数替换字符串时,需要先将目标字符串的长度扩展至源字符串的长度,否则会导致内存访问错误。
修改后的代码如下:
```
#include <iostream>
#include <cstring>
using namespace std;
char *ReplaceString(char *str, char *s1, char *s2);
int main() {
char str[100], s1[10], s2[10];
cin >> str >> s1 >> s2;
char *result = ReplaceString(str, s1, s2);
cout << result << endl;
delete[] result; // 释放内存
return 0;
}
char *ReplaceString(char *str, char *s1, char *s2) {
char *new_str = new char[strlen(str) + 1]; // 新建字符数组,用于存储替换后的字符串
char *a = new_str, *b = s1, *c = s2; // a指向新字符数组的起始位置
while (*str) {
char *p = strtok(str, b);
if (p != NULL) {
strcpy(a, p);
a += strlen(p);
strcpy(a, c);
a += strlen(c);
str += strlen(p) + strlen(b);
}
else {
strcpy(a, str);
break;
}
}
return new_str;
}
```
void displayString(int i, int isDraw, float val, char** stringArray, int x, int y) { (isDraw ? LCD_DisString_Not(x, y, (char *)stringArray[(int)val]) : LCD_DisString(x, y, (char *)stringArray[(int)val])); } const char gcszOnOff[][NEW_DEF_LEN] = {// 投入退出 { "退出" }, { "投入" } }; displayString(i, isDraw, val, gcszOnOff, (i % LISTOFFSET) + 1, 20); 这样调用编译器提示note: expected 'const char **' but argument is of type 'const char (*)
这个编译器提示的意思是,`displayString` 函数的第四个参数应该是一个 `const char **` 类型的指针,但是实际传入的是一个 `const char (*)[]` 类型。这是因为 `gcszOnOff` 是一个二维字符数组,它被定义为 `const char gcszOnOff[][NEW_DEF_LEN]`,表示它的每个元素都是一个长度为 `NEW_DEF_LEN` 的字符数组,而不是一个指向字符数组的指针。
要解决这个问题,可以将 `gcszOnOff` 数组定义为一个指向指针的指针,例如:
```
const char* gcszOnOff[] = { "退出", "投入" };
const char** pGcszOnOff = gcszOnOff;
```
然后将 `pGcszOnOff` 作为参数传递给 `displayString` 函数,就可以避免编译器提示的问题,例如:
```
displayString(i, isDraw, val, pGcszOnOff, (i % LISTOFFSET) + 1, 20);
```
或者,可以修改 `displayString` 函数的声明,将第四个参数的类型改为 `const char (*)[]`,例如:
```
void displayString(int i, int isDraw, float val, const char (*stringArray)[NEW_DEF_LEN], int x, int y) {
(isDraw ? LCD_DisString_Not(x, y, (char *)stringArray[(int)val]) : LCD_DisString(x, y, (char *)stringArray[(int)val]));
}
```
然后就可以使用原来的代码调用 `displayString` 函数了。
阅读全文