将字符串传递给 char 数组,然后在 C 中的位置 x 处修改 char 数组

Posted

技术标签:

【中文标题】将字符串传递给 char 数组,然后在 C 中的位置 x 处修改 char 数组【英文标题】:Passing a string to a char array, then modify the char array at position x in C 【发布时间】:2015-10-21 16:46:26 【问题描述】:

所以我有一个包含"RGGB" 的字符串,我需要将它放在char 数组中以执行一些操作。然后我需要将某些字符替换为空格,例如第一个'G',以便我的char 数组保持"R GB"

我该怎么做?到目前为止,我尝试了这个解决方案:

int main()

    string problem="RGGB";
    const char *p=problem.c_str();
    p[1]=' ';
    return p;

我得到错误:

分配只读位置*(p + ((sizetype)i))

【问题讨论】:

很明显你不能在 const var 中设置一些东西。你可以试试 char *p = strdup(problem.c_str()); 您需要对string 进行哪些操作才能将其转换为char*?使用char* 可以做的任何事情都可以使用string 进行 我相信你可以尝试以下方法:char* p = &problem[0]; 我试过 strdup(problem.c_str());但我得到:'strdup' 未在此范围内声明,我是否应该在代码开头包含一些内容以使其正常工作? 你想要#include 【参考方案1】:

要访问std::string 的“内部字符串”(我的意思是const char*),提供了两个成员函数:std::string::c_strstd::string::data。在 C++11 之前,区别在于 std::string::data 不一定会返回指向以 null 结尾的 const char* 的指针,而 std::string::c_str 是。现在,它们是等价的。并且两者都返回 const char*,甚至在 C++11 之前。

有几种方法可以解决您的问题:

    使用std::strdupstd::str(n)cpy 复制字符串并写入副本。

    使用const_cast。相当激烈,但是,if it doesn't hurt any rules(仅供参考,确实如此)有效。

    根本不要使用std::string。用char* 做你想做的事,然后可以选择将其转换为std::string

    只需使用std::string的功能即可。

【讨论】:

【参考方案2】:

string 是一个 C++ 类,不提供通过 char * 对其内部的直接可变访问。虽然你可以抛弃 const,但这很危险,因为编译器可能会使用 const 作为优化路径。

如果您绝对需要这样做,只需使用 char 数组,而不是字符串或使用字符串方法更改字符串的内容。

【讨论】:

"string […] 不提供通过 char * 对其内部进行直接可变访问",&str.at(0) 呢? str.at(0) 也提供了一个常量引用。如果字符串的内容是用户可更改的,它将破坏编译器优化和内存布局共享。你总是可以抛弃 const 因为 C++ 允许危险的事情,但它会让你故意这样做。它现在可能适用于某些甚至所有编译器,但很可能无法在未来的编译器上运行,即使来自同一供应商。 嗯,at 也有一个non-const overload。从中获取地址会产生一个char*,您可以使用它完全合法地修改字符串。 (只要中间不加'\0'或者修改终结符'\0' 我的立场是正确的。我注意到 str[0] 还返回一个非 const ref。除了 const ref 之外,它应该可以直接写入字符串元素。考虑到 c_str() 不这样做,总是假设否则。我想这样实现者可以剥离副本并为 C 库函数添加一个空值,而不必在每个字符串的末尾存储一个 \0。 字符串对象中不允许\0s吗?我认为避免这种情况的唯一原因是通过 c_str() 与旧的 C 函数一起使用?【参考方案3】:

p[1]=' ';

无效,因为 const char * 是只读指针。

换句话说,它是一个常量指针。

记住:

当const出现在*左边时,指向的是常量,如果const出现在*右边,则指针本身是常量。如果 const 出现在两种尺寸上,则两者都是常量。

此代码可能有效:

char problem[]="RGGB";
char* p = problem;
p[1]=' ';
cout<<problem;

【讨论】:

【参考方案4】:

答案就在你的问题中:

我需要它在 char 数组中

然后放到char数组中:

char problem[] = "RGGB";
problem[1] = ' ';

问题解决了。

另一方面,如果您想使用 actual C++ 解决问题:

std::string problem = "RGGB";
problem.at(1) = ' ';

【讨论】:

以上是关于将字符串传递给 char 数组,然后在 C 中的位置 x 处修改 char 数组的主要内容,如果未能解决你的问题,请参考以下文章

有多少种方法可以将 char 数组传递给 C 中的函数?

如何将 Swift 字符串数组传递给采用 char ** 参数的 C 函数

将 c++ dll 的 char 指针数组传递给 c# 字符串

将 char 指针数组传递给函数

将 C# char 数组传递给 C++ 与字节数组不同

将字符串的char传递给C ++中的函数?