Программирование. Принципы и практика использования C++ Исправленное издание
Шрифт:
res[sz–1]=0;
return res;
}
Правильный ли ответ мы получили? Кто вызовет функцию
free
для строки, которую вернула функция cat
? ПОПРОБУЙТЕ
Протестируйте функцию
cat
. Почему в первой инструкции мы добавляем число 2? Мы сделали глупую ошибку в функции cat
, найдите и устраните ее. Мы “забыли” прокомментировать код. Добавьте соответствующие комментарии,
27.5.1. Строки в стиле языка С и ключевое слово const
Рассмотрим следующий пример:
char* p = "asdf";
p[2] = 'x';
[2]='x'
(который пытается превратить исходную строку в строку "asxf") является недопустимым. К сожалению, некоторые компиляторы пропускают присваивание указателю p
, что приводит к проблемам. Если вам повезет, то произойдет ошибка на этапе выполнения программы, но рассчитывать на это не стоит. Вместо этого следует писать так:
const char* p = "asdf"; // теперь вы не сможете записать символ
// в строку "asdf" с помощью указателя p
Эта рекомендация относится как к языку C, так и к языку C++.
Функция
strchr
из языка C порождает аналогичную, но более трудноуловимую проблему. Рассмотрим пример.
char* strchr(const char* s,int c); /* найти c в константной строке s
(
не C++) */
const char aa[] = "asdf"; /* aa — массив констант */
char* q = strchr(aa,'d'); /* находит символ 'd' */
*q = 'x'; /* изменяет символ 'd' в строке aa на 'x' */
В языке C++ эта проблема решается с помощью немного измененного объявления стандартной библиотечной функции
strchr
.
char const* strchr(const char* s, int c); // найти символ c
// в константной строке s
char* strchr(char* s, int c); // найти символ c в строке s
Аналогично объявляется функция
strstr
. 27.5.2. Операции над байтами
В далеком
void*
, программисты, работавшие на языках C (и C++), для манипуляции байтами использовали строки. В настоящее время основные стандартные библиотечные функции для работы с памятью имеют параметры типа void*
и возвращают указатели типа void*
, чтобы предупредить пользователей о непосредственной работе с памятью без контроля типов.
/* копирует n байтов из строки s2 в строку s1 (как функция strcpy): */
void* memcpy(void* s1, const void* s2, size_t n);
/* копирует n байтов из строки s2 в строку s1
(диапазон [s1:s1+n] может перекрываться с диапазоном [s2:s2+n]): */
void* memmove(void* s1, const void* s2, size_t n);
/* сравнивает n байтов из строки s2 в строку s1
(как функция strcmp): */
int memcmp(const void* s1, const void* s2, size_t n);
/* находит символ c (преобразованный в тип unsigned char)
среди первых n байтов строки s: */
void* memchr(const void* s, int c, size_t n);
/* копирует символ c (преобразованный в тип unsigned char)
в каждый из n байтов строки, на который ссылается указатель s: */
void* memset(void* s, int c, size_t n);
Не используйте эти функции в программах на языке C++. В частности, функция
memset
обычно влияет на гарантии, выданные конструкторами. 27.5.3. Пример: функция strcpy
Определение функции
strcpy
представляет собой печально известный пример лаконичного стиля, который допускает язык C (и C++) .
char* strcpy(char* p, const char* q)
{
while (*p++ = *q++);
return p;
}
Объяснение, почему этот код на самом деле копирует С-строку
q
в С-строку p
, мы оставляем читателям в качестве упражнения. ПОПРОБУЙТЕ
Является ли корректной реализация функции
strcpy
? Объясните почему.
27.5.4. Вопросы стиля
Поделиться:
Популярные книги
Газлайтер. Том 8
8. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
На Ларэде
3. Лэрн
Фантастика:
фэнтези
героическая фантастика
стимпанк
5.00
рейтинг книги
Охота на попаданку. Бракованная жена
Любовные романы:
любовно-фантастические романы
5.60
рейтинг книги
Кай из рода красных драконов
1. Красная кость
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Хозяйка Проклятой Пустоши. Книга 2
2. Хозяйка Проклятой Пустоши
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Безумный Макс. Поручик Империи
1. Безумный Макс
Фантастика:
героическая фантастика
альтернативная история
7.64
рейтинг книги
Потусторонний. Книга 2
2. Господин Артемьев
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Чапаев и пустота
Проза:
современная проза
8.39
рейтинг книги
Солнечный корт
4. Все ради игры
Фантастика:
зарубежная фантастика
5.00
рейтинг книги
Лютая
Любовные романы:
любовно-фантастические романы
6.40
рейтинг книги
Ведьмак (большой сборник)
Ведьмак
Фантастика:
фэнтези
9.29
рейтинг книги
Наследие Маозари 4
4. Наследие Маозари
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Ученик
1. Тай Фун
Фантастика:
фэнтези
5.00
рейтинг книги
Начальник милиции. Книга 5
5. Начальник милиции
Фантастика:
попаданцы
альтернативная история
5.00