2013-06-14 5 views
0

Id любят соединяли строку в моем меню Ncurses к чему-то вроде:меню Ncurses со связанной строки

/bin 
/hello 
/home 
... 

И у меня есть вектор компонентов имени w_files, которые имеют переменную name (бен, привет, дом, .. .), и когда я это сделать:

chdir(w_actDir.c_str()); 
this->selected = 0; 
unsigned int n_choices = w_files.size(); 
my_items = (ITEM **)calloc(n_choices+1, sizeof(ITEM *)); 
for(unsigned int i = 0; i < n_choices; ++i){ 
    string toShow = w_files[i]->getName(); 
    my_items[i] = new_item(toShow.c_str(), ""); 
} 


my_menu = new_menu((ITEM**)my_items); 

set_menu_mark(my_menu, ""); 
set_menu_win(my_menu, this->w_window); 
set_menu_format(my_menu, LINES-5, 1); 
int center = COLS/2; 
set_menu_sub(my_menu, derwin(this->w_window, LINES-5, center-5, 3, 1)); 

post_menu(my_menu); 
wrefresh(this->w_window); 

его нормально, результат выглядит:

bin 
hello 
home 
... 

Но когда изменение линии string toShow = w_files[i]->getName(); к string toShow = "/" + w_files[i]->getName();

Результат: enter image description here

Может кто-нибудь помочь мне, пожалуйста? Спасибо.

+0

Вы фактически должны получать предупреждения, если не ошибки об этом. Это потому, что ''/'' не является 'std :: string', поэтому вы не можете использовать его сначала в выражении конкатенации. Еще хуже, если 'getName' не возвращает строку' std :: string', а затем пытаюсь добавить два указателя. Вместо этого попробуйте 'std :: string ("/") + ...'. –

+0

@JoachimPileborg: не работает ... я не получаю никаких предупреждений и компилирую witch -Wall -pedantic ... метод getName возвращает строку –

+0

Важно ли хранить имена каталогов без «/»? – Losiowaty

ответ

1

На самом деле после публикации комментария у меня возникла идея ответа - самый безопасный способ был бы добавлен к строке toShow.

Пример кода:

string toShow = "/"; 
toShow.append(w_files[i]->getName()); 
+0

тоже не работает ... однако я решил это следующим образом: 'my_items [i] = new_item ("/", w_files [i] -> getName(). c_str()); 'я знаю, что это не лучший вариант, но он работает ... –

+0

Ну, я проверил документы, и кажется, что ваш первый способ (а также мое решение) не имел возможности работать, потому что 'new_item' не копирует переданную строку, он только сохраняет указатель на него, поэтому вы должны убедиться, что память действительна и с первой попыткой создать строку внутри цикла, означало, что она также была удалена после окончания цикла. Я совершенно уверен, что по этой причине способ передачи «/» также подвержен ошибкам. – Losiowaty

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