2016-06-28 4 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

'вектор & раскол (константную строку & с, обугленный DELIM , вектор & elems) {/ * ... */return elems; } '- просто интересно - почему есть возвращаемое значение, если вы его не используете? –

+2

Почему бы не отладить его, чтобы увидеть, что именно происходит? и почему вы думаете, что вам нужно «возвращаться»? Вы проходите по ссылке, поэтому нет необходимости возвращать ее снова. Просто 'void' это –

+0

@underscore_d Он не возвращает ссылку на локальную переменную. 'elems' в' return elems' - это неконстантная ссылка, переданная в качестве параметра. –

ответ

4

Используйте printf("filename is %s\n", x.back().c_str()); для печати строки.

Ваша проблема в том, что вы отправляете адрес строкового объекта printf, но printf ожидает массив символов с нулевым завершением. Функция члена c_str дает вам именно это!

+0

Thank вы очень! Оно работает. – Nikolaj

+1

Это было бы скорее ответом, если бы вы объяснили, почему существует проблема и почему это ее решает. –

+0

добавлено описание – morotspaj

1

Вы передаете неправильный параметр printf("%s"). %s ожидает строку C (т. Е. Char *), но вы передаете ей адрес C++ std::string. Это неопределенное поведение.

Что вам нужно сделать, это убедиться, что вы получаете C-строковое представление std::string возвращенного std::vector<std::string>::at(int), вызывая его c_str() метода:

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

Смежные вопросы