Уменьшение количества операторов
Чтобы определить конец символьной строки, каждая из предыдущих программ использовала следующий цикл while:
while (*string != '\0')
Как уже обсуждалось, символ NULL ('\0') представляет собой значение ASCII 0. Так как C++ использует значение 0, чтобы представить ложь, ваши программы могут записать предыдущий цикл следующим образом:
while (*string)
В данном случае пока символ, определяемый указателем строки, не равен 0 (NULL), условие оценивается как истинное и цикл будет продолжаться. Из урока 5 вы узнали, что постфиксная операция увеличения C++ позволяет вам использовать значение переменной, а затем увеличивает это значение. Многие программы на C++ используют постфиксные операции увеличения и уменьшения, чтобы сканировать массивы с помощью указателей. Например, использование постфиксной операции увеличения делает следующие циклы while идентичными:
while (*string)
{
cout *string++;
}
while (*string)
{
cout *string;
string++;
}
Оператор cout *string++, заставляет C++ вывести символ, указываемый указателем string, а затем увеличить текущее значение string, чтобы он указывал на следующий символ. С помощью этих методов следующая программа SMARTPTR.CPP иллюстрирует новую реализацию функций show_string и string_length:
#include iostream.h
void show_string(char *string)
{
while (*string) cout *string++;
}
int string_length(char •string)
(
int length = 0;
while (*string++) length++;
return(length) ;
}
void main(void)
{
char title[] = "Учимся программировать на языке C++";
show_string(title) ;
сout " содержит " string_length(title) " символов";
}
Если вы встретите функции C++, которые манипулируют строками с помощью указателей, то они с большой долей вероятности будут использовать подобную краткую запись.
Сканирование символьной строки
Одно из наиболее широко употребляемых использовании указателей в программах на C++ заключается в сканировании символьных строк. Для уменьшения количества кода многие программы используют следующие операторы для сканирования строки:
while (*string)
{
// операторы
string++;
// продвинуть к следующему символу
}
Следующая функция string_uppercase использует указатели для преобразования символов строки в символы верхнего регистра:
char *string_uppercase(char* string)
{
char *starting_address = string; // адрес string[0];
while (*string)
{
if ((*string = 'а') (*string = 'я')) *string = *string - 'a' + 'A';
string++;
}
return(starting_address);
}
Эта функция сохраняет и возвращает начальный адрес строки, который позволяет вашим программам использовать функцию следующим образом:
cout Btring_uppercase("Привет, мир!") endl;
* Поскольку при переводе книги обрабатываемые символы заменены с английских на русские, то этот алгоритм работает не для всех кодировок кирилицы в DOS и Windows. — Прим. перев.