Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 拆分字符串C++;由'\';_C++_C - Fatal编程技术网

C++ 拆分字符串C++;由'\';

C++ 拆分字符串C++;由'\';,c++,c,C++,C,我正在尝试按“”从Windows拆分路径,但当我运行程序时崩溃。 下面是一个小例子: char*s = "C:\\windows\\system32\\calc.exe"; char*pch; pch = strtok(s,"\\"); while(pch!=NULL){ printf("%s\n",pch); pch = strtok(NULL,"\\"); } 我可以手动进行搜索,但我认为这是一种更简单的方

我正在尝试按“”从Windows拆分路径,但当我运行程序时崩溃。 下面是一个小例子:

char*s = "C:\\windows\\system32\\calc.exe";
char*pch;
pch = strtok(s,"\\");
while(pch!=NULL){
 printf("%s\n",pch);
 pch = strtok(NULL,"\\");
}
我可以手动进行搜索,但我认为这是一种更简单的方法。
提前感谢。

在我阅读了所有的评论之后,我意识到我可以复制一个
路径
并用另一个字符替换所有的“\”,比如“*”,然后你可以毫无问题地使用
strtok(modifiedCopy,“*”
函数。无论如何,感谢评论部分的所有人。

您需要一个可变字符串。字符串文本是不可变的。尝试更改字符串文字将导致未定义的行为。而不是
char*s=“C:\\windows\\system32\\calc.exe”(指向字符串文字的指针)您只需使用字符数组
chars[]=“C:\\windows\\system32\\calc.exe”。这将把字符串文本复制到一个可变数组中。

唯一的问题是必须使用
char s[]
insead of
char*s

#include <iostream>
#include <cstring>

using namespace std;

int main(){
    char s[] = "C:\\windows\\system32\\calc.exe";
    char * pch;
    pch = strtok (s,"\\");
    while (pch != NULL) {
        printf ("%s\n",pch);
        pch = strtok (NULL, "\\");
    }
    return 0;
}

“注意:此函数具有破坏性:它在字符串str的元素中写入“\0”字符。特别是字符串文本不能用作strok的第一个参数。“启用编译器警告,编译器将向您显示此类问题。”。应该做所有的事情不要标记C和C++。只标记您正在使用的语言。不要对字符串文字(包括指向字符串文字或其部分的指针)使用
strtok
。要在由文字定义的字符串上使用
strtok
,请使用它初始化数组,如
char s[]=“C:\\windows\\system32\\calc.exe”。在以后的问题中,避免给出单独的摘录;准备一份报告。在编译器中打开警告并注意它们。最好,将编译器设置为警告。错误的数字MARS编译器允许修改字符串文字。因为你被标记为C++,所以使用<代码> STD::String < /Cord>类型来处理字符。然后可以使用
std::string::find
获取起始或结束位置,并使用
std::string::substr
提取子字符串。无需修改字符串。您只需要一个可变字符串。字符串文本是不可变的。试图更改它将导致未定义的行为。而不是
char*s=“C:\\windows\\system32\\calc.exe”您只需
char s[]=“C:\\windows\\system32\\calc.exe”。这将把字符串文字复制到一个可变数组中。@ThomasSablik我尝试了你的建议,效果很好。回答问题以标记正确答案,谢谢
#include <string>
#include <sstream>
#include <algorithm>
#include <iterator>
 
template <class Container>
void split(const std::string& str, Container& cont, char delim = '\\')
{
    std::stringstream ss(str);
    std::string token;
    while (std::getline(ss, token, delim)) {
        cont.push_back(token);
    }
}