как выполнить strcat в параметрах OPENFILENAME в программировании на C

#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, и это было более десяти лет назад.