Содержание

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 <string>
#include <algorithm>
 
// 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 <stdio.h>
#include <string.h>
 
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;
}