C++ 拆分字符串C++;由'\';
我正在尝试按“”从Windows拆分路径,但当我运行程序时崩溃。 下面是一个小例子: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,"\\"); } 我可以手动进行搜索,但我认为这是一种更简单的方
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 ofchar*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);
}
}