Я пытаюсь сравнить имя файла со списком строк, чтобы увидеть, совпадают ли они, и если они это сделают, то верните соответственно
Я использую следующее условие:
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 *)
Вопрос в том, каков смысл вышеприведенной ошибки и как она может быть исправлена?
Проблема у вас есть выходит из того, что 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.
Пожалуйста, оставьте отзыв в комментариях, если это не поможет.
assign
wstr
могут быть объединены в один вызов конструктора.
std::wstring
и его членfind
.MultiByteToWideString
).