|
|||
результат
Одномерные[E1] [E2] массивы используются для создания символьных строк. В языке C/C++ строка определяется как символьный массив, который завершается нулевым символом ('\0'). При определении длины символьного массива необходимо учитывать признак её завершения и задавать его длину на единицу больше длины самой большой строки из тех, которые предполагается хранить в этом массиве. Например, объявляя массив str, предназначенный для хранения 10символьной строки, следует использовать следующую инструкцию. char str[11]; Заданный[E3] здесь размер (11) позволяет зарезервировать место для нулевого символа в конце строки. Язык C/C++ позволяет определять строковые литералы, которые представляют собой список символов, заключённый в двойные кавычки. Вот несколько примеров. "Привет" "Мне нравится С++" « » Строка[E4] , приведенная последней (""), называется нулевой. Она состоит только из одного нулевого символа (признака завершения строки). Нулевые строки используются для представления пустых строк. С++-компилятор автоматически добавляет в конец строковых констант нулевые символы, поэтому вводить их вручную не следует. Проще всего считать строку с клавиатуры, создав массив, который примет эту строку с помощью инструкции cin. Считывание строки, введённой пользователем с клавиатуры, отображено в следующей программе. #include <iostream> using namespace std; int main() { char str[80]; cout << "Введите строку: "; cin >> str; // Считывание строку с клавиатуры. cout << "Вот ваша строка: " << str; return 0; Несмотря на то, что эта программа формально корректна, она не лишена недостатков. Если запустить программу на выполнение, то результат будет такой. Введите строку: Это проверка Вот ваша строка: Это Как видно из примера, при выводе строки, введённой с клавиатуры, программа отображает только слово "Это", а не всю строку. Дело в том, что оператор ">>" прекращает считывание строки, как только встречает символ пробела, табуляции или новой строки. Для решения этой проблемы можно использовать ещё одну библиотечную функцию gets(). Общий формат её вызова таков: gets[E5] (имямассива); Если в программе необходимо считать строку с клавиатуры, то следует вызвать функцию gets(), а в качестве аргумента передать имя массива, не указывая индекса. После выполнения этой функции заданный массив будет содержать текст, введённый с клавиатуры. Функция gets()считывает вводимые пользователем символы до тех пор, пока он не нажмёт клавишу <Enter>. Для вызова функции gets()в программу необходимо включить заголовок <cstdio>. В следующей версии предыдущей программы демонстрируется использование функции gets(), которая позволяет ввести в массив строку символов, содержащую пробелы. #include <iostream> #include <cstdio> using namespace std; int main() { char str[80]; cout << "Введите строку: "; gets(str); // Считываем строку с клавиатуры. cout << "Вот ваша строка: " << str; return 0; } результат Введите строку: Это простой тест Вот ваша строка: Это простой тест При вводе строки символов следует иметь ввиду, что ни оператор ">>", ни функция gets()не выполняют граничной проверки (на отсутствие нарушения границ массива). Поэтому, если пользователь введёт строку, длина которой превышает размер массива, возможны неприятности. Из этого следует, что оба варианта считывания строк с клавиатуры потенциально опасны. Язык C/C++ поддерживает множество функций обработки строк. Самыми распространёнными из них являются следующие: strcpy() strcat() strlen() strcmp() Для вызова всех этих функций в программу необходимо включить заголовок <cstring>. Ниже представлено описание функций обработки строк. Функция strcpy() Общий формат вызова функции strcpy()таков: strcpy(to, from); Функция strcpy()копирует содержимое строки from в строку to. При вызове этой функцией следует иметь в виду, что массив, используемый для хранения строки to, должен быть достаточно большим, чтобы в него можно было поместить строку из массива from. В противном случае массив to переполнится, т.е. произойдёт выход за его границы, что может привести к разрушению программы. Использование функции strcpy()демонстрируется в следующей программе, которая копирует строку "Привет" в строку str. #include <iostream> #include <cstring> using namespace std; int main() { char str[80]; strcpy(str, "Привет"); cout << str; return 0; } Функция strcat() Обращение к функции strcat()имеет следующий формат. strcat(s1, s2); Функция strcat()присоединяет строку s2 к концу строки s1; при этом строка s2 не изменяется. Обе строки должны завершаться нулевым символом. Результат вызова этой функции, т.е. результирующая строка s1 также будет завершаться нулевым символом. Использование функции strcat()демонстрируется в следующей программе, которая должна вывести на экран строку "Привет всем!". #include <iostream> #include <cstring> int main(){ char s1[20], s2[10]; strcpy(s1, "Привет"); strcpy(s2, " всем!"); strcat (s1, s2); std::cout << s1; return 0; } Функция strcmp() Обращение к функции strcmp()имеет следующий формат: strcmp(s1, s2); Функция strcmp()сравнивает строку s2 со строкой s1 и возвращает значение 0, если они равны. Если строка s1 лексикографически (т.е. в соответствии с алфавитным порядком) больше строки s2, возвращается положительное число. Если строка s1 лексикографически меньше строки s2, возвращается отрицательное число. Использование функции strcmp()демонстрируется в следующей программе, которая служит для проверки правильности пароля, введенного пользователем. #include <iostream> #include <cstring> #include <cstdio> int main(){ char s[80]; std::cout << "Введите пароль: "; gets(s); if(strcmp(s, "пароль")) std::cout << "В доступе отказано.\n"; else std::cout << "Вход разрешен.\n"; return 0; } При использовании функции strcmp()важно помнить, что она возвращает число 0 (т.е. значение false), если сравниваемые строки равны. Следовательно, если необходимо выполнить определенные действия при условии совпадения строк, следует использовать оператор (!). Функция strlen() Общий формат вызова функции strlen()таков: strlen(s); Функция strlen()возвращает длину строки, указанной аргументом s. При выполнении следующей программы будет показана длина строки, введенной с клавиатуры. #include <iostream> #include <cstdio> #include <cstring> int main(){ char str[80] ; std::cout << "Введите строку: "; gets(str); std::cout << "Длина строки равна: " << strlen(str); return 0; } Если пользователь введёт строку "Привет всем!", программа выведет на экране число 12. При подсчёте символов, составляющих заданную строку, признак завершения строки (нулевой символ) не учитывается. Факт завершения нулевыми символами всех С/С++-строк можно использовать для упрощения различных операций над ними. Следующий пример позволяет убедиться в том, насколько простой код требуется для замены всех символов строки их прописными эквивалентами. #include <iostream> #include <cstring> #include <cctype> int main() { char str[80]; strcpy(str, "test"); for(int i=0; str[i]; i++) str[i] = toupper(str[i]); std::cout << str; return 0; } Эта программа при выполнении выведет на экран слово "TEST". Здесь используется библиотечная функция toupper(), которая возвращает прописной эквивалент своего символьного аргумента. Для вызова функции toupper()необходимо включить в программу заголовок <cctype>. Следует обратить внимание на то, что в качестве условия завершения цикла forиспользуется массив str, индексируемый управляющей переменной i(str[i]). Такой способ управления циклом вполне приемлем, поскольку за истинное значение в языке C/C++ принимается любое ненулевое значение. Поскольку, все печатные символы представляются значениями, не равными нулю, и только символ, завершающий строку, равен нулю. Следовательно, этот цикл работает до тех пор, пока индекс не укажет на нулевой признак конца строки, т.е. пока значение str[i]не станет нулевым.
[E1] [E2] [E3] [E4] [E5]
|
|||
|