我想访问字符指针第i个元素。下面是示例代码预先字符指针访问
字符指针访问
回答
指针类型允许使用数组访问器[]
,并且如果[]
中的偏移量指向有效内存,将导致定义的和可预测的行为。
const char* ptr = str.c_str();
if (ptr[2] == '2') {
...
}
所有平台上都会如果的str
长度为3个字符或更正确。
一般来说,如果你没有变异的char*
你在看,最好还是避免const_cast
并用const char*
工作。还请注意std::string
提供了operator[]
这意味着您不需要拨打str
上的.c_str()
就能够索引它并查看char
。如果的长度为str
为3个字符或更多,则在所有平台上的情况类似地都是正确的。如果您事先不知道字符串的长度,请使用std::string::at(size_t pos)
执行绑定检查,并在检查失败时引发out_of_range
异常。
在这种情况下,你可以把炭
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
}
由于*作为字符数组(C-字符串)。括号是允许的。
问题实质上是关于安全地查询字符串中的字符。
const char* a = a_value.c_str();
是安全的,除非某些其他操作修改后面的字符串。如果您可以保证在使用a之前没有其他代码执行修改,那么您已经安全地检索了一个指向以空字符结尾的字符串的指针。
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
}
_“从来不安全”,“未定义的行为”_不正确。演员本身是完全明确的。 –
@LightnessRacesinOrbit恭敬地,我相信你错误地引用了我。我传达的是,标准并不保证由c_str()产生的字符串甚至与std :: string中的存储位于同一个内存地址。它也不保证内存是可写的。因此写入它是未定义的行为。没有理由不应该导致段错误。 –
OP的_not_写入它。在问题的代码中没有_inherent_非安全和没有未定义的行为。要么你正在回答其他问题,要么我没有误导你。 :) –
您可以在std::string
访问第i个元素使用其operator[]()
这样的:
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的对象将被连续地存储。
21.4.7.1/1:c_str()/数据()
返回:指针p,使得
p + i == &operator[](i)
对于每个i在[0,大小()]。
a_value.c_str()不一定与&a_value [0]相同。标准的措辞很微妙,并允许两个不同的调用返回不同的内存引用/地址。 –
@RichardHodges毕竟它是一样的。看我的标准报价。 'c_str()'需要返回一个指针,使得'p + 0 ==&operator [](0)'表示'a_value.c_str()==&a_value [0]'。 – Pixelchemist
我明白了。我错过了。 –
大家都很好地解释了它的安全性,但如果没有问题,我想扩展一下。
由于您使用的是C++,而且您使用的是字符串,因此只需执行以下操作即可访问caracter(并且您不会遇到任何问题,而且您仍然不必处理cstrings在CPP:
std::string a_value = "abcd";
std::cout << a_value.at(2);
这在我看来是一个更好的选择,而不是走出去的方式 字符串::在将根据您的字符串对象返回一个char &或一个const char &(在此。 case,const char &)
- 1. 访问字符指针
- 2. 字符指针抛出访问冲突
- 3. 访问结构成员字符指针
- 4. 访问指针
- 5. 字符指针数组访问字符序列
- 6. 问题与字符指针
- 7. c字符指针问题
- 8. 分配和访问结构中指向字符串的指针
- 9. 访问指向字符串的指针数组
- 10. C指针,指针,字符
- 11. 空指针访问
- 12. 访问双指针
- 13. C++:访问指针
- 14. 获取指针字符指针的地址字符指针
- 15. 的指针访问指针工会
- 16. 字符指针
- 17. 字符指针
- 18. 字符指针
- 19. 字符指针
- 20. 指向字符指针的指针分配问题
- 21. 字体访问PdfClown空指针
- 22. Ç指定字符串指针到其他字符串指针
- 23. 无效指针访问字符数组中的结构
- 24. C++访问此指针内的字符串索引
- 25. 空指针访问为
- 26. 指针访问冲突? - C++
- 27. C#ReadProcessMemory - 访问/读指针
- 28. 空指针访问警告
- 29. 空指针可访问
- 30. 从指针访问结构
'a_value [2]'有什么问题?' – Quentin
为什么你n在这里eed'const_cast'? – myaut
@BoBTFish它不是,只要'a_char'不用于实际修改字符串。这仍然是一个非常非常糟糕的主意。 – Quentin