2016-06-28 89 views
-1

我想split a string它的工作原理。这只是当我打印到console我得到一个奇怪的output像这样 - ╨╕[╝。也许有人可以提示我做错了什么?这是我的代码C++分割字符串给出了一个奇怪的输出

#include <stdio.h> 
#include <windows.h> 
#include <string> 
#include <sstream> 
#include <vector> 


using namespace std; 

vector<string> &split(const string &s, char delim, vector<string> &elems); 

vector<string> split(const string &s, char delim); 

int main() { 

    vector<string> x = split("E:\\TEST\\filename.txt", '\\'); 

    int pos = x.size() - 1; 
    printf("filename is %s\n", &x.at(pos)); 

    system("PAUSE"); 

    return 0; 
} 

vector<string> &split(const string &s, char delim, vector<string> &elems) { 
    stringstream ss(s); 
    string item; 
    while (getline(ss, item, delim)) { 
     elems.push_back(item); 
    } 
    return elems; 
} 


vector<string> split(const string &s, char delim) { 
    vector<string> elems; 
    split(s, delim, elems); 
    return elems; 
} 
+0

'矢量和分裂(常量字符串&S,焦炭DE​​LIM ,矢量&elems){/ * ... */return elems; }' - 只是想知道 - 如果你不使用它,为什么会有返回值? –

+2

为什么不进行调试以查看究竟发生了什么?以及为什么你认为你需要'返回'的东西?你通过引用传递,所以不需要再返回它。只是'无效'它 –

+0

@underscore_d它不会返回一个局部变量的引用。 'return elems'中的'elems'是作为参数传入的非const引用。 –

回答

4

使用printf("filename is %s\n", x.back().c_str());来打印字符串。

您的问题是您要将字符串对象的地址发送到printf,但printf需要一个以null结尾的char数组。成员函数c_str只是给你!

+0

感谢你真是太棒了!有用。 – Nikolaj

+1

如果你解释了为什么存在问题以及为什么解决问题,这将更像是一个答案。 –

+0

补充说明 – morotspaj

1

您将错误的参数传递给printf("%s")%s需要一个C字符串(即一个char *),但是您要传递一个C++ std::string的地址。这是未定义的行为。

你需要做的是确保你通过调用其c_str()方法获得通过std::vector<std::string>::at(int)返回std::string的C-字符串表示:

printf("filename is %s\n", x.at(pos).c_str());