我想访问字符指针iith元素。以下是示例代码
string a_value = "abcd";
char *char_p=const_cast<char *>(a_value.c_str());
if(char_p[2] == 'b') //Is this safe to use across all platform?
{
//do soemthing
}
提前致谢
答案 0 :(得分:3)
允许指针类型使用数组访问器[]
,如果[]
内的偏移量指向有效内存,则会产生已定义和可预测的行为。
const char* ptr = str.c_str();
if (ptr[2] == '2') {
...
}
在所有平台上都是正确的,如果 str
的长度为3个字符或更多。
一般情况下,如果您没有改变正在查看的char*
,最好避免使用const_cast
并使用const char*
。另请注意,std::string
提供了operator[]
,这意味着您无需致电.c_str()
上的str
即可将其编入索引并查看char
。如果 str
的长度为3个字符或更多,则在所有平台上同样正确。如果您事先不知道字符串的长度,请使用std::string::at(size_t pos)
执行绑定检查,如果检查失败则抛出out_of_range
异常。
答案 1 :(得分:3)
您可以使用std::string
访问operator[]()
中的第i个元素,如下所示:
std::string a_value = "abcd";
if (a_value[2] == 'b')
{
// do stuff
}
如果您使用符合C ++ 11的std::string
实现,您也可以使用:
std::string a_value = "abcd";
char const * p = &a_value[0];
// or char const * p = a_value.data();
// or char const * p = a_value.c_str();
// or char * p = &a_value[0];
21.4.1 / 5
basic_string对象中的类char对象应连续存储。
21.4.7.1/1:c_str()/ data()
返回:指针p,使{i,size()]中每个i的
p + i == &operator[](i)
。
答案 2 :(得分:1)
问题主要在于安全地查询字符串中的字符。
const char* a = a_value.c_str();
除非某些其他操作修改后面的字符串,否则是安全的。如果您可以保证在使用之前没有其他代码执行修改,那么您已经安全地检索了一个指向以null结尾的字符串的指针。
char* a = const_cast<char *>(a_value.c_str());
永远不会安全。你已经产生了一个指向可写内存的指针。但是,该内存从未被设计为写入。无法保证写入该内存实际上会修改字符串(实际上并不保证它不会导致核心转储)。这是未定义的行为 - 绝对不安全。 请参考此处:http://en.cppreference.com/w/cpp/string/basic_string/c_str
寻址a[2]
是安全的,前提是你可以证明所有可能的代码路径都能确保a代表一个指向内存超过2个字符的指针。
如果您想要安全,请使用:
auto ch = a_string.at(2); // will throw an exception if a_string is too short.
或
if (a_string.length() > 2) {
auto ch = a_string[2];
}
else {
// do something else
}
答案 3 :(得分:0)
每个人都非常清楚地解释了它的安全性,但是如果可以的话,我还想延长一点。
由于您使用的是C ++,并且您正在使用字符串,因此您只需执行以下操作即可访问字符(并且您不会遇到任何麻烦,而您仍然会赢得&#39 ; t必须处理cpp中的cstrings:
<script type="text/javascript" src="/js/skrollr.min.js"></script>
<script type="text/javascript" src="/js/homepageanimation.js"></script>
在我看来,这是一个更好的选择,而不是偏离方式。 string :: at将返回一个char&amp;或者是一个const char&amp;取决于你的字符串对象。 (在这种情况下,一个const char&amp;)
答案 4 :(得分:-1)
在这种情况下,您可以将char *视为字符数组(C-string)。允许括号。