#c #strcat
#c #strcat
Вопрос:
У меня есть рабочий код, использующий OPENFILENAME. Могу ли я узнать, как использовать strcat для динамического управления его параметрами
это работает
//ofn.lpstrFilter = "Rule Files (*.net and *.rul)*.rul;*.net";
char filter[100];
char filterText[100];
char filterVal[100];
strcpy(filterText, "Rule Files (*.net and *.rul)");
strcpy(filterVal, "*.rul;*.net");
Сначала я попытался использовать strcat с ‘ 0’, но он отображается только так
strcat (filter, filterText);
strcat (filter,"");
strcat (filter,filterVal);
strcat (filter,"");
ofn.lpstrFilter = filter; \missing
И я попытался использовать ‘ 0’
strcat (filter, filterText);
strcat (filter,"\0");
strcat (filter,filterVal);
strcat (filter,"\0");
ofn.lpstrFilter = filter; \now includes the
но когда я запускаю программу, фильтр диалогового окна отображается следующим образом
«Файлы правил (*.net и *.rul) 0*.rul; *.net «;
Спасибо
Комментарии:
1.
strcat
объединяет строки… вы хотите объединить или разделить строку, что на самом деле требуетсяstrtok
?2. То, что вы делали ранее, правильно. Почему вы хотите показать завершающий символ?
3. @Jason amp; Mahesh — я хочу динамически разрешить другому пользователю устанавливать текст фильтра и значения фильтра. Таким образом, другой пользователь может просто захотеть использовать другой параметр, а не фильтр статического типа, другой пользователь может захотеть, чтобы его фильтр выглядел следующим образом ofn.lpstrFilter = «Все файлы (*.*)*.*»;
4. @Jason amp; Mahesh — я редактирую и показываю, как мне не удается объединить filterText и filterVal с ‘ 0’, чтобы правильно следовать правильному синтаксису значения ofn.lpstrFilter. Спасибо
Ответ №1:
Использование "\0"
не даст ничего полезного, это просто поместит два буквальных символа
в вашу строку, когда вам нужен нулевой байт. Однако строки в C заканчиваются на, ''
поэтому вы не можете использовать strcat
для построения строки, разделенной нулем, без некоторой арифметики указателя.
Итак, учитывая эти:
char filterText[] = "Rule Files (*.net and *.rul)";
char filterVal[] = "*.rul;*.net";
char filter[100];
Вам нужно будет сделать что-то вроде этого:
/*
* The first one is a straight copy.
*/
strcpy(filter, filterText);
/*
* Here we need to offset into filter to right after the
* nul byte from the first copy.
*/
strcpy(amp;filter[strlen(filterText) 1], filterVal);
Лучшим подходом было бы выделить ваш filter
с malloc
, чтобы вам не приходилось беспокоиться о переполнении буфера:
char *filter = malloc(strlen(filterText) 1 strlen(filterVal) 1);
Комментарии:
1. @mu слишком короткое — Спасибо за ответ, а также за предложение malloc.
2. Или даже:
size_t txt_len = strlen(filterText); size_t val_len = strlen(filterVal); char *filter = malloc(txt_len val_len 1); memmove(filter, filterText, txt_len); memmove(filter txt_len, filterVal, val_len 1);
, необязательно заменяяmemcpy()
наmemmove()
, потому что это безопасно в данном контексте, хотяmemmove()
всегда безопасно иmemcpy()
не всегда безопасно. (Если цель состоит в том, чтобы в результате получить две строки, разделенные нулем, тогда вам нужно скорректировать длину, выделяемую на 1, первую длину, скопированную на 1, и смещение второй копии на 1; или эквивалентный набор изменений).3. @Jonathan: Вы также могли бы использовать
sizeof(filterVal)
вместоstrlen(filterVal) 1
посколькуfitlerVal
этоchar[]
. Этот странный формат с нулевыми разделителями используется Windows для (AFAIK) стандартного диалогового окна с файлами, поэтому вам нужен дополнительный 1. Или просто объявите все это как одинchar[]
as{'R','u', ...}
.4. Спасибо за информацию; Я живу, я учусь, я забываю. Вы могли бы просто использовать:
char filter[] = "Rule Files (*.net and *.rul)*.rul;*.net";
, который вкратце дает вам требуемый результат — если только нет несносного компилятора, который думает, что вам не могут понадобиться данные после первого null в строке.5. @Jonathan: Ну, это Windows… Я решил, что наилучшим выбором было бы работоспособное решение для пары произвольных (но хорошо сформированных) строк. Вы могли бы даже установить соответствующие биты в
int*
и преобразовать их вchar*
. На самом деле зависит от того, насколько сильно вы ненавидите людей, которые должны поддерживать ваш код. Я все еще пытаюсь забыть свое время, занимаясь разработкой Windows, и это было более десяти лет назад.