Вход/Регистрация
Программирование. Принципы и практика использования C++ Исправленное издание
вернуться

Страуструп Бьерн

Шрифт:

27.5.3. Пример: функция strcpy

Определение функции

strcpy
представляет собой печально известный пример лаконичного стиля, который допускает язык C (и C++) .

char* strcpy(char* p, const char* q)

{

while (*p++ = *q++);

return p;

}

Объяснение, почему этот код на самом деле копирует С-строку

q
в С-строку
p
, мы оставляем читателям в качестве упражнения.

ПОПРОБУЙТЕ

Является ли корректной реализация функции

strcpy
? Объясните почему.

Если вы не можете аргументировать свой ответ, то не вправе считать себя программистом, работающим на языке C (однако вы можете быть компетентным в других языках программирования). Каждый язык имеет свои собственные идиомы, это относится и к языку C.

27.5.4. Вопросы стиля

Мы потихоньку втягиваемся в длинные и часто яростно оспариваемые вопросы стиля, которые, впрочем, часто не имеют большого значения. Мы объявляем указатель следующим образом:

char* p; // p — указатель на переменную типа char

Мы не принимаем стиль, продемонстрированный ниже.

char *p; /* p — нечто, что можно разыменовать, чтобы получить символ */

Пробел совершенно игнорируется компилятором, но для программиста он имеет значение. Наш стиль (общепринятый среди программистов на языке С++) подчеркивает тип объявляемой переменной, в то время как альтернативный стиль (общепринятый среди программистов на языке С) делает упор на использовании переменной. Мы не рекомендуем объявлять несколько переменных в одной строке.

char c, *p, a[177], *f; /* разрешено, но может ввести в заблуждение */

Такие объявления часто можно встретить в старых программах. Вместо этого объявления следует размещать в нескольких строках, используя свободное место для комментариев и инициализации.

char c = 'a'; /* символ завершения ввода для функции f */

char* p = 0; /* последний символ, считанный функцией f */

char a[177]; /* буфер ввода */

char* f; /* считывает данные в буфер a;

возвращает указатель
на первый считанный символ */

Кроме того, выбирайте осмысленные имена.

27.6. Ввод-вывод: заголовок stdio

В языке С нет потоков ввода-вывода

iostream
, поэтому мы используем стандартный механизм ввода-вывода языка С, определенный в заголовочном файле
<stdio.h>
. Эквивалентами потоков ввода и вывода
cin
и
cout
из языка С++ в языке С являются потоки
stdin
и
stdout
. Стандартные средства ввода-вывода языка С и потоки
iostream
могут одновременно использоваться в одной и той же программе (для одних и тех же потоков ввода-вывода), но мы не рекомендуем это делать. Если вам необходимо совместно использовать эти механизмы, хорошенько разберитесь в них (обратите особое внимание на функцию
ios_base::sync_with_stdio
), используя хороший учебник. См. также раздел Б.10.

27.6.1. Вывод

Наиболее популярной и полезной функцией библиотеки

stdio
является функция
printf
. Основным предназначением функции
printf
является вывод С-строки.

#include<stdio.h>

void f(const char* p)

{

printf("Hello, World!\n");

printf(p);

}

Это не очень интересно. Намного интереснее то, что функция

printf
может получать любое количество аргументов и начальную управляющую строку, которая определяет, как вывести дополнительные аргументы. Объявление функции
printf
в языке C выглядит следующим образом:

int printf(const char* format, ...);

Многоточие (

...
) означает “и, возможно, остальные аргументы”. Мы можем вызвать функцию
printf
так:

void f1(double d, char* s, int i, char ch)

{

printf("double %g string %s int %d char %c\n", d, s, i, ch);

}

где символы

%g
означают: “Напечатать число с плавающей точкой, используя универсальный формат”, символы
%s
означают: “Напечатать С-строку”, символы
%d
означают: “Напечатать целое число, используя десятичные цифры,” а символы
%c
означают: “Напечатать символ”. Каждый такой спецификатор формата связан со следующим, до поры до времени не используемым аргументом, так что спецификатор
%g
выводит на экран значение переменной
d
;
%s
— значение переменной
s
,
%d
— значение переменной
i
, а
%c
— значение переменной
ch
. Полный список форматов функции
printf
приведен в разделе Б.10.2.

К сожалению, функция
printf
не является безопасной с точки зрения типов. Рассмотрим пример.

char a[] = { 'a', 'b' }; /* нет завершающего нуля */

void f2(char* s, int i)

{

printf("goof %s\n", i); /* неперехваченная ошибка */

printf("goof %d: %s\n", i); /* неперехваченная ошибка */

printf("goof %s\n", a); /* неперехваченная ошибка */}

  • Читать дальше
  • 1
  • ...
  • 452
  • 453
  • 454
  • 455
  • 456
  • 457
  • 458
  • 459
  • 460
  • 461
  • 462
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: