Strcat() (от слова concatenation – соединение)

Strlen() (от слова length – длина)

Наша программа, которая подсчитает количество символов в строке:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 #include <iostream> using namespace std;   int main() {  setlocale(LC_ALL, "rus");    char ourStr[128] = ""; // для сохранения строки    cout << "Введите текст латиницей (не больше 128 символов):\n";  cin.getline(ourStr, 128);    int amountOfSymbol = 0; // счетчик символов  while (ourStr[amountOfSymbol]!= '\0')  {  amountOfSymbol++;  }    cout << "Строка \"" << ourStr << "\" состоит из "  << amountOfSymbol << " символов!\n\n";    return 0; }

Для подсчёта символов в строке неопределённой длины (так как вводит её пользователь), мы применили цикл while – строки 13 – 17. Он перебирает все ячейки массива (все символы строки) поочередно, начиная с нулевой. Когда на каком-то шаге цикла встретится ячейка ourStr [amountOfSymbol], которая хранит символ \0, цикл приостановит перебор символов и увеличение счётчика amountOfSymbol.

Так будет выглядеть код, с заменой нашего участка кода на функцию strlen():

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #include <iostream> #include <cstring> using namespace std;   int main() {  setlocale(LC_ALL, "rus");    char ourStr[128] = ""; // для сохранения строки    cout << "Введите текст латиницей (не больше 128 символов):\n";  cin.getline(ourStr, 128);    cout << "Строка \"" << ourStr << "\" состоит из "  << strlen(ourStr) << " символов!\n\n";    return 0; }

Как видите, этот код короче. В нем не пришлось объявлять дополнительные переменные и использовать цикл. В выходном потоке cout мы передали в функцию строку – strlen(ourStr). Она посчитала длину этой строки и вернула в программу число. Как и в предыдущем коде-аналоге, символ \0 не включен в общее количество символов.

Результат будет и в первой программе и во второй аналогичен:

strcat() (от слова concatenation – соединение)

Программа, которая в конец одной строки, дописывает вторую строку. Другими словами – объединяет две строки.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 #include <iostream> using namespace std;   int main() {  setlocale(LC_ALL, "rus");    char someText1[64] = "Сайт purecodecpp.com!";  char someText2[] = "Учите С++ c нами!";    cout << "Строка someText1- \"" << someText1 << "\" \n";  cout << "Строка someText2- \"" << someText2 << "\" \n\n";    int count1 = 0; // для индекса ячейки где хранится '\0' первой строки  while (someText1[count1]!= 0)  {  count1++; // ищем конец первой строки  }    int count2 = 0; // для прохода по символам второй строки начиная с 0-й ячейки  while (someText2[count2]!= 0)  { // дописываем вконец первой строки символы второй строки  someText1[count1] = someText2[count2];  count1++;  count2++;  }    cout << "Строка someText1 после объединения с someText2 -\n\"" << someText1 << "\" \n\n";    return 0; }

По комментариям в коде должно быть всё понятно. Ниже напишем программу для выполнения таких же действий, но с использованием strcat(). В эту функцию мы передадим два аргумента (две строки) – strcat(someText1, someText2);. Функция добавит строку someText2 к строке someText1. При этом символ '\0' в конце someText1 будет перезаписан первым символом someText2. Так же она добавит завершающий '\0'

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #include <iostream> #include <cstring> using namespace std;   int main() {  setlocale(LC_ALL, "rus");    char someText1[64] = "Сайт purecodecpp.com!";  char someText2[] = "Учите С++ c нами!";    cout << "Строка someText1 - \"" << someText1 << "\" \n";  cout << "Строка someText2 - \"" << someText2 << "\" \n\n";  strcat(someText1, someText2); // передаём someText2 в функцию    cout << "Строка someText1 после объединения с someText2 -\n\"" << someText1 << "\" \n\n";    return 0; }

Реализация объединения двух строк, используя стандартную функцию, заняла одну строчку кода в программе – 14-я строка.

Результат:

На что следует обратить внимание и первом и во втором коде – размер первого символьного массива должен быть достаточным для помещения символов второго массива. Если размер окажется недостаточным – может произойти аварийное завершение программы, так как запись строки выйдет за пределы памяти, которую занимает первый массив. Например:

1 2 char someText1[22] = "Сайт purecodecpp.com!"; strcat(someText1, "Учите С++ c нами!");

 

В этом случае, строковая константа “Учите С++ c нами!” не может быть записана в массив someText1. В нём недостаточно места, для такой операции.

Если вы используете одну из последних версий среды разработки Microsoft Visual Studio, возможно возникновение следующей ошибки: “error C4996: ‘strcat’: This function or variable may be unsafe. Consider using strcat_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.” Так происходит потому, что уже разработана новая более безопасная версия функции strcat – это strcat_s.

Она заботится о том, чтобы не произошло переполнение буфера (символьного массива, в который производится запись второй строки). Среда предлагает вам использовать новую функцию, вместо устаревшей. Почитать больше об этом можно на сайте msdn. Подобная ошибка может появиться, если вы будете применять функцию strcpy, о которой речь пойдет ниже.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: