2016-06-28 134 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());