В языке С строки являются обычными массивами фиксированного размера из символов ``char`` (однобайтные символы) или ``wchar_t`` (символы Unicode). Признаком конца строки является нулевой символ ``'\0'``, хранение которого нужно учитывать при определении размера массива.
```c++
char s[]="ABC";
```
эквивалентно
```c++
char s[]={'A','B','C','\0'}; // массив из 4 символов
```
Действия над строками в языке С определены как функции в заголовочных файлах ``<string.h>``, ``<wchar.h>``, ``<stdio.h>``. Основными недостатками этих функций является низкая эффективность, сложный код, необходимость проверки не только переполнения выделенной памяти, но и выхода за пределы текущей длины строки.
Гораздо удобнее использовать строки в языке С++, определенные в заголовочном файле ``<string>``
Функция | Строки ``char`` | Строки ``wchar_t``| Строки С++
----|----|----|---
Определение строк|``char s1[101], // строка длиной 100 символов + место для '\0'``\
``s2[101]="ABC"; // с заданием начального значения``\
``char* sr; // для результатов поиска``|``wchar_t s1[101], s2[101]=L"ABC";``\
``wchar_t* sr;``|``string s1, s2="ABC"; // wstring s1, s2=L"ABC";``
Вспомогательные объявления|``size_t len, // длина строки``\
``pos=2, // позиция в строке``\
``n=5; //количество символов``\
``int a; double b; // для преобразований строка<->число``
Длина строки | ``len=strlen(s2);`` | ``len=wcslen(s2);``| ``len=s2.length(); // len=s2.size();``
Проход по всем символам строки|``for(int i=0; s1[i]; ++i) // s1[i]``|``for(int i=0; s1[i]; ++i) // s1[i]``|``for(int i=0; i<s1.size(); ++i) // s1[i]``
Копирование строки | ``strcpy(s1,s2);`` | ``wcscpy(s1,s2);``|``s1=s2;``
Заполнение строки символом| ``memset(s1,'A',n); s1[n]=0;`` | ``wmemset(s1,L'A',n); s1[n]=0;``|``s1=string(n,'A');``
Подстрока с ``pos`` длиной ``n`` (или до конца строки)|``strncpy(s1,s2+pos,n); s1[n]=0;``|``wcsncpy(s1,s2+pos,n); s1[n]=0;``|``s1=s2.substr(pos,n);``
Добавление строки | ``strcat(s1,s2);`` | ``wcscat(s1,s2);``| ``s1+=s2;``
Добавление символа | ``len=strlen(s1); s1[len++]='A'; s1[len]=0;`` | ``len=wcslen(s1); s1[len++]='A'; s1[len]=0;``| ``s1+='A';``
Удаление подстроки с ``pos`` длиной ``n`` (или до конца строки)|``if(pos+n<len) strcpy(s1+pos,s1+pos+n);``\
``else s1[pos]=0;``|``if(pos+n<len) wcscpy(s1+pos,s2+pos+n);``\
``else s1[pos]=0;``|``s1.erase(pos,n);``
Вставка строки|``n=strlen(s2);``\
``memmove(s1+pos,s1+pos+n,len+1-pos-n);``\
``strncpy(s1+pos,s2,n);``|``n=wcslen(s2);``\
``wmemmove(s1+pos,s1+pos+n,len+1-pos-n);``\
``wcsncpy(s1+pos,s2,n);``|``s1.insert(pos,s2);``
Сравнение строк | ``if(strcmp(s1,s2)>=0) // s1>=s2`` | ``if(wcscmp(s1,s2)>=0)`` | ``if(s1>=s2)``
Поиск подстроки/символа | ``sr=strstr(s1,s2); // sr=strchr(s1,'A');``\
``if(sr) { pos=sr-s1; ... // s2 найдена в позиции pos``\
``else { ... // s2 не найдена``|``sr=wcsstr(s1,s2); // sr=wcschr(s1,L'A');``\
``if(sr) { pos=sr-s1; ... } else {...}``| ``pos=s1.find(s2); // pos=s1.find('A');``\
``if(pos!=string::npos) {/* найдена */}``\
``else { /* нет */}``
Ввод слова | ``scanf("%100s",s1);`` | ``wscanf(L"%100ls",s1);`` | ``cin>>s1;``
Ввод строки до '\n' | ``if(scanf("%100[^\n]", s1) != 1) s1[0] = 0;``\
``getchar();`` | ``if(wscanf(L"%100l[^\n]", s1) != 1) s1[0] = 0;``\
``getwchar();`` | ``getline(cin,s1);``
Вывод строки | ``printf("%s",s1);`` | ``wprintf(L"%ls",s1);`` | ``cout<<s1;``
Преобразование строки в число| ``sscanf(s1,"%d",&a);``\
``sscanf(s1,"%lf",&b);``|``swscanf(s1,L"%d",&a);``\
``swscanf(s1,L"%lf",&b);``|``a=stoi(s1);``\
``b=stod(s1);``
Преобразование числа в строку| ``sprintf(s1,"%d",a);``\
``sprintf(s1,"%lg",b);``|``swprintf(s1,L"%d",a);``\
``swprintf(s1,L"%lg",b);``|``s1=to_string(a);``\
``s1=to_string(b);``
```run-c
#include <stdio.h>
#include <string.h>
// Вывод всех строк в обратном порядке
int main() {
char s1[101];
for(;;) {
if(scanf("%100[^\n]", s1) != 1) s1[0] = 0;
if(getchar()==EOF) break;
size_t len=strlen(s1);
for(int i=len-1;i>=0;--i)
printf("%c",s1[i]);
printf("\n");
}
}
<<
Коту тащат уток.
Was it a car or a cat I saw?
```
Для распознавания символов в С и С++ используются функции, объявленные в заголовочных файлах ``<ctype.h>``,``<wctype.h>``.
Для однобайтных символов на результат будет влиять выбор кодировки:\
``setlocale(LC_CTYPE|LC_COLLATE, "Russian");``
Функция | ``char`` | ``wchar_t``
----|----|----
Пробельный символ (``' ', '\n', '\t'``, ...)|``isspace(c)``|``iswspace(c)``
Цифра|``isdigit(c)``|``iswdigit(c)``
Буква|``isalpha(c)``|``iswalpha(c)``
Буква или цифра|``isalnum(c)``|``iswalnum(c)``
Строчная буква|``islower(c)``|``iswlower(c)``
Прописная буква|``isupper(c)``|``iswupper(c)``
В строчную букву|``c=tolower(c);``|``c=towlower(c);``
В прописную букву|``c=toupper(c);``|``c=towupper(c);``
```run-c
#include <stdio.h>
#include <string.h>
// Первая строка содержит запрещенные буквы в верхнем регистре
// Вторая строка число N
// Далее N строк, для каждой строки вывести yes, если строка не содержит запрещенных букв, иначе no
int main() {
char dis[101],s[101];
int n;
scanf("%100s%d%*c",dis,&n); // ввести слово, число и символ '\n' после числа
for(int i=0;i<n;++i) {
if(scanf("%100[^\n]", s) != 1) s[0] = 0;
getchar();
int fl=1;
for(int j=0;dis[j];++j)
if(strchr(s,dis[j]) || strchr(s,tolower(dis[j]))) {
fl=0;
break;
}
if(fl) printf("yes\n");
else printf("no\n");
}
}
<<
QYFJX
2
Oma, Ich habe nicht die Uhr geklaut.
Das Raumschiff ist kaputt. Hilfe ist notwendig.
```