Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.81/16: Рейтинг темы: голосов - 16, средняя оценка - 4.81
0 / 0 / 0
Регистрация: 15.06.2021
Сообщений: 174

Ошибки компиляции примера из учебника Lafore

15.06.2021, 16:12. Показов 3178. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Перенёс решённую в учебнике задачу в компилятор, он мне выдаёт ошибки. И уже не в первый раз. Жалко бросать этот учебник(Lafore), но как учиться по нему дальше?
1)Есть ли достойный современный учебник для начинающих?
2) Что изменилось в программировании, почему выдаёт ошибку? Ошибки были в 46-48 строках. В 46 - нельзя присвоить массиву char константное значение (сейчас, почему-то не выдаёт ошибки). В 47-48 - нет подходящего конструктора. Быть может, strcpy(str, s) не работает, какую-нибудь чёрточку добавили?
Вот эта программа:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <iostream>
using namespace std;
#include <string.h> // для функций strcpy, strcat
#include <stdlib.h> // для функции exit
///////////////////////////////////////////////////////////
class String // наш класс для строк
{
private:
    enum { SZ = 80 }; // максимальный размер строки
    char str[SZ]; // массив для строки
public:
    // конструктор без параметров
    String()
    {
        strcpy(str, "");
    }
    // конструктор с одним параметром
    String(char s[])
    {
        strcpy(str, s);
    }
    // показ строки
    void display() const
    {
        cout << str;
    }
    // оператор сложения
    String operator+(String ss) const
    {
        String temp; // временная переменная
        if (strlen(str) + strlen(ss.str) < SZ)
        {
            strcpy(temp.str, str); // копируем содержимое первой строки
            strcat(temp.str, ss.str); // добавляем содержимое второй строки
        }
        else
        {
            cout << "\nПереполнение!";
            exit(1);
        }
        return temp; // возвращаем результат
    }
};
int main()
{
    char S[] = "С Новым годом!"; //От себя добавил. Прошлый раз тоже писала ошибку.46
    String s1 = "\nС Рождеством! "; // используем конструктор с параметром 47
    String s2 = "С Новым годом!"; // используем конструктор с параметром 48
    String s3; // используем конструктор без параметров
    // показываем строки
    s1.display();
    s2.display();
    s3.display();
    s3 = s1 + s2; // присваиваем строке s3 результат сложения строк s1 и s2
    s3.display(); // показываем результат
    cout << endl;
    return 0;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.06.2021, 16:12
Ответы с готовыми решениями:

Ошибка компиляции примера из учебника
Переписал вот такой вот код из учебника по c ansi от Денниса Ритчи и Брайана Кернигана: #include &lt;stdio.h&gt; #define MAXLINE...

Ошибка при компиляции примера
Я начинаю учить ассемблер по книге О. А. Калашникова &quot;Ассемблер Это просто&quot;(второе издание) Там в качестве первого примера программы...

Ошибка при компиляции примера библиотеки libcli
Проблема не совсем в библиотеке, сколько в том, что у меня недостаточно знаний, чтобы понять, почему выходит ошибка. ОС Freebsd, библиотека...

15
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
15.06.2021, 17:16
Walex, 1) добавьте в начало
C++
1
#define _CRT_SECURE_NO_WARNINGS
чтобы работали строковые функции (или перейдите на их аналоги с суффиксом _s)
1) строковые литералы передаются, как const char *, а не char *. Конструктор для const... отсутствует, вот и ругается. Сделайте, например, так:
C++
1
2
3
4
5
    // конструктор с одним параметром
    String(const char s[])
    {
        strcpy(str, s);
    }
1
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
15.06.2021, 17:27
Цитата Сообщение от Walex Посмотреть сообщение
Есть ли достойный современный учебник для начинающих?
Лафоре как раз - шикарен, имхо!
1
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
15.06.2021, 18:23
Лучший ответ Сообщение было отмечено Walex как решение

Решение

Walex, https://www.cyberforum.ru/post12974695.html
0
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,244
15.06.2021, 18:29
Этот пример в VS2008 компилируется без ошибок.
в VS2017 нужны исправления связанные с более строгой типизацией.
C++
1
2
    // конструктор с одним параметром
    String(const char s[])
1
0 / 0 / 0
Регистрация: 15.06.2021
Сообщений: 174
17.06.2021, 08:42  [ТС]
Действительно, как только добавил "const", эта ошибка пропала, но возникла новая: 'strcpy' - c4996. Компилятор, как я понимаю, пишет, что функция устарела.

Добавлено через 8 минут
const - помогло, спасибо, добавление директивы#define _CRT_SECURE_NO_WARNINGS видимого эффекта не произвело. Пишет, что strcpy & strcat - устарели.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
17.06.2021, 08:44
Лучший ответ Сообщение было отмечено Walex как решение

Решение

Walex, добавлять это надо до всех #include
0
0 / 0 / 0
Регистрация: 15.06.2021
Сообщений: 174
17.06.2021, 09:07  [ТС]
Заработало, спасибо! Но, чтобы я мог этим пользоваться, Вы можете объяснить, что я этим достиг?
2) Действительно ли устарели команды strcpy & strcat?

Добавлено через 9 минут
Visual C++: используем _CRT_SECURE_NO_WARNINGS для совместимости с классическими функциями
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
17.06.2021, 09:09
Лучший ответ Сообщение было отмечено ПерС как решение

Решение

Walex, нет, не устарели. Это собственная политика MS.
0
0 / 0 / 0
Регистрация: 15.06.2021
Сообщений: 174
17.06.2021, 10:37  [ТС]
Мне необходимо в этой же программе с помощью перегруженной операции "++" изменить буквы в строке на заглавные. Я написал:
C++
1
2
3
4
5
6
7
void operator++()
    {
        
        int l = strlen(str);
        for (int j = 0; j < l; j++)
            str[j] = toupper(str[j]);
    }
Не работает. Но и ошибку не выдаёт. Просто не видит:
String s1 = "\nС Рождеством! ";
++s1;
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
17.06.2021, 11:17
Walex, функция toupper() работает только с английскими буковками

Добавлено через 6 минут
Замените на
C++
1
str[j] = _toupper_l(str[j],_get_current_locale());
И установите в начале main() русскую локаль:
C++
1
    setlocale(LC_ALL, "Russian");
0
0 / 0 / 0
Регистрация: 15.06.2021
Сообщений: 174
17.06.2021, 14:12  [ТС]
Огромное спасибо! Всё работает! Я-то, как юзер, в первую очередь считаю, что это я ошибся! Такие нюансы, разумеется, с первых шагов ни узнать, ни запомнить невозможно! После ваших советов перестаёшь биться головой об стол. Ведь, вроде всё правильно, всё логично, а не работает!
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
17.06.2021, 14:14
Walex,

Во-первых toupper работает с локальными кодировками, но только если выставить правильную локаль. То есть будет тоже самое, если только поставить setlocale
Во-вторых, если нужно параметризовать локаль, есть же std::toupper вместо нестандартной _toupper_l.
0
0 / 0 / 0
Регистрация: 15.06.2021
Сообщений: 174
17.06.2021, 14:23  [ТС]
функцию toupper я вставил по рекомендации из учебника Lafore. Там же был и русский текст. Но ничего про локальные кодировки. Учебник, в самом деле, великолепный. Но он регулярно ставит задачи, для решения которых он только намекнул на средства их решения. По принципу "Спасение утопающих..." Возможно, таков стиль обучения. Но без советов опытных программистов - трудно двигаться дальше.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
17.06.2021, 14:28
Цитата Сообщение от Walex Посмотреть сообщение
После ваших советов перестаёшь биться головой об стол. Ведь, вроде всё правильно, всё логично, а не работает!
В первую очередь нужно не "биться головой", а учиться работать с документацией. Ведь все написано:
Converts the given character to uppercase according to the character conversion rules defined by the currently installed C locale.

In the default "C" locale, the following lowercase letters abcdefghijklmnopqrstuvwxyz are replaced with respective uppercase letters ABCDEFGHIJKLMNOPQRSTUVWXYZ.
https://en.cppreference.com/w/... te/toupper

https://man7.org/linux/man-pag... per.3.html
If c is a lowercase letter, toupper() returns its uppercase
equivalent, if an uppercase representation exists in the current
locale.
А также:
The standards require that the argument c for these functions is
either EOF or a value that is representable in the type unsigned
char. If the argument c is of type char, it must be cast to
unsigned char
, as in the following example:

char c;
...
res = toupper((unsigned char) c);

This is necessary because char may be the equivalent signed char,
in which case a byte where the top bit is set would be sign
extended when converting to int, yielding a value that is outside
the range of unsigned char.
Добавлено через 2 минуты
Цитата Сообщение от Walex Посмотреть сообщение
функцию toupper я вставил по рекомендации из учебника Lafore. Там же был и русский текст.
Это проблема перевода. В оригинале никакого русского текста не было, разумеется. У автора на английском все работает. Для русского нужно менять локаль, и переводчик, хотя бы в сноске, должен был об этом сказать.
Так что стиль обучения тут не при чем, это издержки посредственных русских переводов.
1
0 / 0 / 0
Регистрация: 15.06.2021
Сообщений: 174
17.06.2021, 14:54  [ТС]
Должен был сам догадаться! Но, в условиях, когда пытаешься запихнуть в голову массу новых терминов, та вопиёт: "Спасите, убивают!"
Ещё раз, спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.06.2021, 14:54
Помогаю со студенческими работами здесь

Ошибка компиляции примера SFML + OpenGL в MinGW
проблема компиляции (путь прописан в системе до компилятора правильно) компил через ком. строку ~~g++ 0000.cpp In file included...

списал с учебника-выдает ошибки
Посмотрите, пожалуйста, код. Списал с учебника, но компилатор кричит о массе ошибок. В чем может быть дело? #include &lt;stdio.h&gt;...

Пример с учебника выдаёт ошибки
Здравствуйте. Есть такая задача( пример):Найти и вывести на печать координаты и значение минимума функции двух переменных f(x, y) =...

Пример с учебника выдаёт ошибки
Здравствуйте, сейчас пытаюсь учить процессы/job-ы и т.д. Вот взял пример с учебника , вроде всё правильно переписал, но выдаёт кучу...

перепечатал с учебника-выдает ошибки
Подскажите в чем может быть дело. Перепечатал код один к одному из учебника: #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru