strstr - string.h ошибка недопонимания?

0

Я пытаюсь сравнить имя файла со списком строк, чтобы увидеть, совпадают ли они, и если они это сделают, то верните соответственно

Я использую следующее условие:

if (strstr(file, str) != NULL) {
    return 1;
}

Хотя MSVС++ 2012 предлагает мне следующую ошибку в strstr:

Error: no instance of overloaded function "strstr" matches the argument list
argument types are: (WCHAR [260], char *)

Вопрос в том, каков смысл вышеприведенной ошибки и как она может быть исправлена?

  • 3
    Я бы предложил заменить это на std::wstring и его член find .
  • 1
    Вы пытаетесь сравнить строку Unicode с многобайтовой строкой, и для этого нет встроенной функции. Вам нужно сначала преобразовать одно в другое (скорее всего, сначала преобразовать многобайтовую строку в Unicode с MultiByteToWideString ).
Показать ещё 2 комментария
Теги:
visual-studio
winapi
string.h

1 ответ

0
Лучший ответ

Проблема у вас есть выходит из того, что strstr функция ожидает увидеть два char указатели (char *) в качестве своих аргументов, но получает WCHAR массив вместо в качестве первого аргумента.

В отличие от обычного 8-битного символа, WCHAR представляет 16-разрядный символ Unicode.

Единственный способ исправить вашу ошибку - преобразовать имя файла Unicode в массив символов следующим образом:

char cfile[260];
char DefChar = ' ';
WideCharToMultiByte(CP_ACP, 0, file, -1, cfile, 260, &DefChar, NULL);

И затем используйте cfile вместо file.

Но этот подход будет работать только с символами ASCII.

По этой причине вы можете рассмотреть возможность использования другого метода сравнения строк, подходящего для строк WCHAR ( wstring).

Следующий код может помочь вам в этом втором подходе:

// Initialize the wstring for file
std::wstring wsfile (file);    

// Initialize the string for str
std::string sstr(str);

// Initialize the wstring for str
std::wstring wstr(sstr.begin(), sstr.end());

// Try to find the wstr in the wsfile
int index = wsfile.find(wstr); 

// Check if something was found
if(index != wstring::npos) {
    return 1;
}

Хороший ответ SO об использовании метода find в std::wsting: Найти метод в std :: wstring.

Подробнее о преобразовании string в wstring: Mijalko: Преобразование std :: string в std :: wstring.

Пожалуйста, оставьте отзыв в комментариях, если это не поможет.

  • 1
    Обратите внимание, что вызовы создания и assign wstr могут быть объединены в один вызов конструктора.
  • 0
    @ Крис, спасибо, исправлено!
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню