C++如何将字符串转换为char*

Non*_*biz 4 c++ casting strtok

我需要将字符串转换为char*以便在strtok_s中使用,并且无法弄明白.c_str()转换为const char*,它是不兼容的.

此外,如果有人可以向我解释为什么第二个strtok_s函数(在循环内)是必要的,这将是一个很大的帮助.为什么我需要明确地推进令牌而不是例如它所处的while循环,它隐式地连续地获取文件的每一行.

while( getline(myFile, line) ) { // Only one line anyway. . . is there a better way?
    char * con = line.c_str();
    token = strtok_s( con, "#", &next_token);
    while ((token != NULL))
    {
        printf( " %s\n", token );
        token = strtok_s( NULL, "#", &next_token);
    }
}
Run Code Online (Sandbox Code Playgroud)

相关问题.

Wer*_*sey 8

使用strdup()该副本const char *由返回c_str()char *(记得free()它之后)

请注意,strdup()并且free()是C,而不是C++,函数,你最好使用std::string相反的方法.

第二个strtok_s()是必需的,否则你的循环不会终止(token值不会改变).


Gab*_*yer 5

丹尼尔说,你可以去

strdup(line.c_str());

这比我最初提出的strcpy更好,因为它分配了必要的空间

  • `strdup(line.c_str())`可能会更好. (3认同)
  • 小心:这不是开箱即用的.你必须为`con`分配内存. (2认同)

Mar*_*n B 5

你不能转换为a,char *因为这会允许你写入std::string内部缓冲区.为了避免使std::string实现可见,这是不允许的.

而不是strtok尝试更多"类似C++"的方式来标记字符串.看到这个问题:

如何在C++中对字符串进行标记?

  • 你只需要相信它.从const到非const指针的转换是可能的,但是尝试修改指向的数据具有未定义的行为.`c_str()`不需要返回字符串的内部缓冲区 - 它可以将字符串复制到新位置并向您显示.显然修改原始字符串的任何此类克隆都不起作用.在C++ 0x中,字符串的实现受到更严格的控制,而IIRC你可以使用`&line [0]`作为指向字符串数据的`char*`.虽然这可能不是NUL终止的. (4认同)