====== C / C++ Strings ====== Как-бы на Stackoverflow на русском, очень часто люди спрашивали как писать правильно wchar_t да так что-бы комп нормально понимал. Все обычные строковые функции хранятся в **string.h**, для работы с wide char хранятся в **wchar.h** хочу заметить что wchar.h должен подключаться САМЫМ ПЕРВЫМ include'ом! Это важно. Так-же для могут понадобиться **stdio.h** и **stdlib.h** - в них есть куча полезных вещей, например printf в stdio или memset в stdlib очень упростят работу с любым Ptr (void*). И разница в в malloc и calloc в том, что calloc (character allocation) занимает в памяти место и тут-же зануляет буфер "\0\0\0\0\0", а malloc (memory allocation) просто занимает в памяти место и У пойми какая там ересь может быть. ===== Основы ===== ^ char* ^ wchar_t* ^ std::string ^ Описание ^ | "str", str[], str[n] | L"str", ... | "str" | Создать строку статический | | malloc, calloc || new std::string(n) | Создать строку динамический (не забываем про free(chrptr*)) | | strlen | wcslen | str.length() | Посчитать количество символов до первого '\0' | | strcpy | wcscpy | std::string str = "abc" | Копирует текст с начала строки, и завершает её '\0' | | strcat | wcscat | str += "abc" | Добавляет к строке строку, и завершает её через '\0' | | strcmp | wcscmp | str1.compare(str2) | Сравнить 2 строки, если равны то результат == 0 | | strstr | wcsstr | str.find | Найти строку в строке, в Си результат будет ptr* на символ или NULL при ошибке | | strrchr | wcsrchr | | Найти совпадение с конца строки, работает так-же как strstr | | fgets | fgetws | std::cin >> str | Прочитать строку из буфера stdin, в Си при провале вернёт NULL, при перегрузке длинны буфера например 1024б вернёт 1023 байта + '\0' | | fputs | fputws | std::cout << str << endl | Выводит текст на экран без форматирования в качестве файла используем stdout | | printf | wprintf(L"Привет %ld!\n", L"мир") | | Выводит форматированную строку, аналога в С++ нету, но можно форматировать через чередование cout. cout << "Строка" << 5 << endl; | ===== Конвертируем String в WideString ===== #include #include // Prototype for conversion functions std::wstring StringToWString(const std::string& s); std::string WStringToString(const std::wstring& s); //--- std::wstring StringToWString(const std::string& s) { std::wstring temp(s.length(),L' '); std::copy(s.begin(), s.end(), temp.begin()); return temp; } std::string WStringToString(const std::wstring& s) { std::string temp(s.length(), ' '); std::copy(s.begin(), s.end(), temp.begin()); return temp; } ===== Хороший пример по StrStr ===== #include #include int main() { char str1[11] = "0123456789"; // не забываем про 10+'\0' char str2[10] = "345"; char* istr; istr = strstr(str1, str2); if (istr == NULL) { printf("Substring not found!\n"); } else { printf("Substing starts from simbol %ld\n", istr-(str1)+1); // Out -> Substing starts from simbol 4 } return 0; }