字符指针访问

时间:2015-05-06 14:39:31

标签: c++ character

我想访问字符指针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
}

提前致谢

5 个答案:

答案 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)。允许括号。