我写过这个奇怪的代码片段。如何type
在其printf
提前致谢
int main()
{
string label = string("faults_team_A_player_12");
size_t f = label.find('_');
const char *type = label.substr(0,f).c_str();
const char team = label.at(f+sizeof("team_"));
printf("type = %s\n",type);
int n;
size_t l = label.length()-label.find_last_of('_');
int x = sscanf((char *)label.substr(label.find_last_of('_'),l).c_str(),"_%d",&n);
printf("type = %s\n",type);
printf("team = %c\n",team);
printf("player = %d\n",n);
return 0;
}
输出:
type = faults
type = _12
team = A
player = 12
答案 0 :(得分:4)
type
是dangling pointer,因为它初始化为临时std::string
实例的内部成员:
const char *type = label.substr(0,f).c_str();
获取std::string
结果的c_str()
实例会立即被破坏。
答案 1 :(得分:3)
const char *type = label.substr(0,f).c_str();
指针type
指的是临时(label.substr(0,f)
)内的一段数据。对该指针的任何使用都是未定义的行为。
答案 2 :(得分:0)
当您通过调用std::string
获得指向.c_str()
缓冲区的指针时,您不会获取缓冲区。例如,当字符串对象超出范围时,指针将失效。