将字符串传递给 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要访问std::string
的“内部字符串”(我的意思是const char*
),提供了两个成员函数:std::string::c_str
和std::string::data
。在 C++11 之前,区别在于 std::string::data
不一定会返回指向以 null 结尾的 const char*
的指针,而 std::string::c_str
是。现在,它们是等价的。并且两者都返回 const char*
,甚至在 C++11 之前。
有几种方法可以解决您的问题:
使用std::strdup
或std::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 数组的主要内容,如果未能解决你的问题,请参考以下文章
如何将 Swift 字符串数组传递给采用 char ** 参数的 C 函数