Программирование. Принципы и практика использования C++ Исправленное издание, стр. 392
ни в программе на языке C, ни в программе на языке C++. Однако в языке С++ мы могли бы определить конструктор для структуры
PairPair* pp = new Pair("pear", 42)В языке C (но не в языке C++; см. раздел 27.3.4) перед вызовом функции malloc() можно не указывать приведение типа, но мы не рекомендуем это делать.
int* p = malloc(sizeof(int)*n); /* избегайте этого */Игнорирование приведения довольно часто встречается в программах, потому что это экономит время и позволяет выявить редкую ошибку, когда программист забывает включить в текст программы заголовочный файл
<stdlib.h>malloc()p = malloc(sizeof(char)*m); /* вероятно, ошибка — нет места для m целых */
malloc()/free()new/deletemalloc()deletefree()int* p = new int[200];// ...free(p); // ошибкаX* q = (X*)malloc(n*sizeof(X));// ...delete q; // errorЭтот код может оказаться вполне работоспособным, но он не является переносимым. Более того, для объектов, имеющих конструкторы и деструкторы, смешение стилей языков C и C++ при управлении свободной памятью может привести к катастрофе. Для расширения буферов обычно используется функция
realloc()int max = 1000;int count = 0;int c;char* p = (char*)malloc(max);while ((c=getchar())!=EOF) { /* чтение: игнорируются символы в конце файла */ if (count==max–1) { /* необходимо расширить буфер */ max += max; /* удвоить размер буфера */ p = (char*)realloc(p,max); if (p==0) quit(); } p[count++] = c;}Объяснения операторов ввода в языке С приведены в разделах 27.6.2 и Б.10.2.
realloc()realloc()newИспользуя стандартную библиотеку языка C++, этот код можно переписать примерно так:
vector<char> buf;char c;while (cin.get(c)) buf.push_back(c);Более подробное обсуждение стратегий ввода и распределения памяти можно найти в статье “Learning Standard C++ as a New Language” (см. список библиографических ссылок в конце раздела 27.1).
27.5. Строки в стиле языка С
Строка в языке C (в литературе, посвященной языку С++, ее часто называют С-строкой (C-string), или строкой в стиле языка С (C-style)) — это массив символов, завершающийся нулем. Рассмотрим пример.
char* p = "asdf";char s[ ] = "asdf";
В языке C нет функций-членов, невозможно перегружать функции и нельзя определить оператор (такой как
==<string.h>size_t strlen(const char* s); /* определяет количество символов */char* strcat(char* s1, const char* s2); /* копирует s2 в конец s1 */int strcmp(const char* s1, const char* s2); /* лексикографическое сравнение */char* strcpy(char* s1,const char* s2); /* копирует s2 в s1 */char* strchr(const char *s, int c); /* копирует c в s */char* strstr(const char *s1, const char *s2); /* находит s2 в s1 */char* strncpy(char*, const char*, size_t n); /* сравнивает n символов */char* strncat(char*, const char, size_t n); /* strcat с n символами */int strncmp(const char*, const char*, size_t n); /* strcmp с n символами */Это не полный список функций для работы со строками, но он содержит самые полезные и широко используемые функции. Кратко проиллюстрируем их применение.
==strcmp()