Как исправить ошибку в операторе =?
Нужно написать оператор присваивания для класса. Все уже как-бы написано но неизвестная мне ошибка портит всю малину. Вот код функции :
void String::operator=(String& other) {
delete[]this->string_;
this->string_ = new char[strlen(other.string_)];
for (size_t i = 0; i < strlen(other.string_); i++)
{
this->string_[i] = other.string_[i];
}
}
Вот код мейна :
#include "String.h"
#include <iostream>
using namespace std;
int main() {
String str1;
str1.inputString();
String str2;
str2 = str1;
str2.print();
}
-
Вопрос заданболее двух лет назад
-
68 просмотров
Надо выделять памяти на +1 символ для завершающего » (который вы тоже должны в конце ставить).
Потом, можно использовать strcpy вместо ручного цикла. И потом, ваш класс сильно проигрывает std::string — подумайте над вариантом использовать его. Ну или используйте его внутри вашего класса вместо ручного выделения памяти.
Ну, поскольку нам эта ошибка тоже неизвестна, вы обречены.
Впрочем, хрустальный шар мне подсказывает, что вы работаете с С-style строками, но при этом забываете про завершающий 0. Только и всего.
Пригласить эксперта
-
Показать ещё
Загружается…
ЛАНИТ
•
Санкт-Петербург
До 200 000 ₽
12 июн. 2023, в 18:45
15000 руб./за проект
12 июн. 2023, в 18:41
20000 руб./за проект
12 июн. 2023, в 18:29
10000 руб./за проект
Минуточку внимания
Dmitry37 1 / 1 / 0 Регистрация: 06.12.2011 Сообщений: 15 |
||||
1 |
||||
Исправить ошибку «ожидался оператор»10.01.2012, 15:13. Показов 32615. Ответов 3 Метки нет (Все метки)
Program vector;
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
10.01.2012, 15:13 |
Ответы с готовыми решениями: Исправить ошибку «ожидался оператор» Ошибка «Ожидался оператор» при вычислении выражения Поиск суммы положительных четных чисел и ошибка «Ожидался оператор» var q:real; Массив записей о городах: «ожидался оператор» 3 |
Puporev Почетный модератор 64288 / 47587 / 32739 Регистрация: 18.05.2008 Сообщений: 115,181 |
||||
10.01.2012, 15:17 |
2 |
|||
Сообщение было отмечено Памирыч как решение РешениеИсправить очень сложно, примерно так.
точку с запятой поставить.
1 |
1852 / 1174 / 190 Регистрация: 27.03.2009 Сообщений: 4,514 |
|
10.01.2012, 15:17 |
3 |
точку с запятой поставь после Writeln(‘элементы матрицы y’)
0 |
1 / 1 / 0 Регистрация: 06.12.2011 Сообщений: 15 |
|
10.01.2012, 15:20 [ТС] |
4 |
Спасибо, согласен, тупанул))
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
10.01.2012, 15:20 |
4 |
Я кодирую в sandbox.cs50.io и постоянно получаю одну и ту же ошибку. Это мой код:
#include <stdio.h>
#include <cs50.h>
int main(void)
{
int x = get_int( );
switch(x)
{
case1: printf("One!n");
break;
case2: printf("Two!n");
break;
case3: printf("Three!n");
break;
default: printf("Sorry!n");
break;
}
}
ОШИБКА:
clang -fsanitize=signed-integer-overflow -fsanitize=undefined -ggdb3 -O0 -std=c11 -Wall -Werror -Wextra -Wno-sign-compare -Wno-unused-parameter
-Wno-unused-variable -Wshadow switch.c -lcrypt -lcs50 -lm -o switch
switch.c:6:18: **error: too few arguments to function call, at least argument 'format' must be specified**
**int x = get_int( );**
~~~~~~~ ^
/usr/include/cs50.h:82:1: note: 'get_int' declared here
int get_int(const char *format, ...) __attribute__((format(printf, 1, 2)));
^
1 error generated.
<builtin>: recipe for target 'switch' failed
make: *** [switch] Error 1
2020-06-12 12:40
2
ответа
Вы ввели case1, case2 и case3. Это должен быть случай 1, случай 2, случай 3, я имею в виду пробел. Попытайся.
2020-06-12 13:14
Вам нужна строка формата: x = get_int(«%d»);
2020-06-12 12:45
Автор оригинала: Pankaj Kumar.
Недостижимый оператор в Java является ошибкой во время компиляции. Эта ошибка возникает, когда в вашем коде есть оператор, который не будет выполнен ни разу. Эта ошибка указывает на логический недостаток в потоке вашего кода.
Такая ошибка может возникнуть из-за бесконечного цикла или размещения кода после оператора return или break среди нескольких других причин.
Давайте рассмотрим несколько примеров недостижимых утверждений.
1. Недоступно во время цикла
Если условие цикла while таково, что оно никогда не является истинным, то код внутри цикла никогда не будет выполняться. Это делает код внутри цикла while недоступным.
package com.journaldev.java; public class Main { public static void main(String[] args) { while(3>5){ System.out.println("Hello"); } } }
Среда IDE указывает на ошибку при написании кода. Это довольно “разумно”.
При беге мы получаем:
2. Код после бесконечного цикла
Фрагмент кода сразу после бесконечного цикла никогда не будет выполнен. На самом деле, весь код после бесконечного цикла никогда не будет выполнен. Это должно побудить вас обратить внимание при написании конечного условия цикла.
package com.journaldev.java; public class Main { public static void main(String[] args) { while(true){ System.out.println("Hello"); } int a=1; } }
3. Код после перерыва или продолжения инструкции
Оператор Break позволяет нам выйти из цикла. Оператор Continue позволяет нам пропустить текущую итерацию и перейти к следующей итерации, размещая код после того, как любой из двух операторов сделает оператор недоступным.
package com.journaldev.java; public class Main { public static void main(String[] args) { for(int i=0;i<5;i++){ if(i==2){ break; System.out.println("Hello"); } } } }
Как исправить ошибку недостижимого оператора?
Нет никакого конкретного способа исправить такую ошибку. Все зависит от того, насколько вы хороши как программист. Проблема заключается в потоке вашего кода.
Блок-схемы необходимы для понимания потока любого кода. Вы можете попробовать нарисовать блок-схему для проблемы, которую вы пытаетесь решить. Затем вы можете сопоставить свой код с блок-схемой или написать код с нуля, исходя из этого нового понимания проблемы.
Еще один вопрос, который может возникнуть при ошибке такого типа, заключается в том, нужны ли вам вообще утверждения, которые недоступны? Может быть, вам на самом деле не нужны заявления, в этом случае вы можете просто пойти дальше и удалить их.
Если вы все еще не можете понять это, вы всегда можете прокомментировать этот пост, и мы поможем вам разобраться в этом. Вот для чего мы здесь 🙂
Автор материалов — Лада Борисовна Есакова.
Самая распространенная ошибка, которую нужно найти и исправить – это неправильное использование вложенных условных операторов. Для усложнения поиска возможно неправильное форматирование текста (неправильно поставленные отступы).
Для того, чтобы найти ошибку, нужно поставить в соответствие друг другу все части условного оператора if и else.
Помним, что часть else относится к ближайшему if. При этом наличие части else не обязательно.
Кроме того, часто присутствует ошибка при вводе или выводе. Обязательно нужно проверить, та ли информация выводится на экран.
Особого внимания требует инициализация переменных.
Формат книги не позволяет рассмотреть все основные типы задач 2 части, рассмотрим лишь те, которые встречались на проверочных и экзаменационных работах последних двух лет.
Пример 1.
На обработку поступает положительное целое число, не превышающее 109. Нужно написать программу, которая выводит на экран сумму цифр этого числа, меньших 7. Если в числе нет цифр, меньших 7, требуется на экран вывести 0. Программист написал программу неправильно. Ниже эта программа для Вашего удобства приведена на пяти языках программирования.
Бейсик |
Python |
DIM N, DIGIT, SUM AS LONG
INPUT N SUM = 0 WHILE N > 0 DIGIT = N MOD 10 IF DIGIT < 7 THEN SUM = SUM + 1 END IF N = N 10 WEND PRINT DIGIT |
N = int(input())
sum = 0 while N > 0: digit = N % 10 if digit < 7: sum = sum + 1 N = N // 10 print(digit) |
Паскаль |
Алгоритмический язык |
var N, digit, sum: longint;
begin readln(N); sum := 0; while N > 0 do begin digit := N mod 10; if digit < 7 then sum := sum + 1; N := N div 10; end; writeln(digit) end. |
алг
нач цел N, digit, sum ввод N sum := 0 нц пока N > 0 digit := mod(N,10) если digit < 7 то sum := sum + 1 все N := div(N,10) кц вывод digit кон |
Си |
|
#include
int main() { int N, digit, sum; scanf(«%d», &N); sum = 0; while (N > 0) { digit = N % 10; if (digit < 7) sum = sum + 1; N = N / 10; } printf(«%d»,digit); return0; } |
Последовательно выполните следующее.
1. Напишите, что выведет эта программа при вводе числа 456.
2. Приведите пример такого трёхзначного числа, при вводе которого программа выдаёт верный ответ.
3. Найдите все ошибки в этой программе (их может быть одна или несколько). Известно, что каждая ошибка затрагивает только одну строку и может быть исправлена без изменения других строк. Для каждой ошибки:
1) выпишите строку, в которой сделана ошибка;
2) укажите, как исправить ошибку, т.е. приведите правильный вариант строки.
Достаточно указать ошибки и способ их исправления для одного языка программирования. Обратите внимание, что требуется найти ошибки в имеющейся программе, а не написать свою, возможно, использующую другой алгоритм решения. Исправление ошибки должно затрагивать только строку, в которой находится ошибка.
Решение:
Решение использует запись программы на Паскале. Допускается использование программы на любом из четырёх других языков.
1. Программа выведет число 4.
2. Пример числа, при вводе которого программа выдаёт верный ответ: 835.
Программа работает неправильно из-за неверной выводимой на экран переменной и неверного увеличения суммы. Соответственно, программа будет работать верно, если в числе старшая цифра (крайняя левая) равна сумме цифр, меньших 7.
3. В программе есть две ошибки.
Первая ошибка. Неверное увеличение суммы.
Строка с ошибкой:
sum := sum + 1;
Верное исправление:
sum := sum + digit;
Вторая ошибка. Неверный вывод ответа на экран.
Строка с ошибкой:
writeln(digit)
Верное исправление:
writeln(sum)
Пример 2.
Для заданного положительного вещественного числа A необходимо найти максимальное целое число K, при котором выполняется неравенство
(при K = 0 сумма считается равной 0).
Для решения этой задачи ученик написал такую программу.
Бейсик |
Python |
DIM A, S AS DOUBLE
DIM K AS INTEGER INPUT A K = 1 S = 1 WHILE S < A S = S + 1.0/K K = K + 1 WEND PRINT K END |
a = float(input())
k = 1 s = 1 while s < a: s = s + 1.0/k k = k + 1 print(k) |
Алгоритмический язык |
Паскаль |
алг
нач вещ a, s цел k ввод a k := 1 s := 1 нц пока s<a s := s + 1.0/k k := k + 1 кц вывод k кон |
var a, s: real;
k: integer; begin read(a); k := 1; s := 1; while s<a do begin s := s + 1.0/k; k := k + 1; end; write(k); end. |
Си |
|
#include <stdio.h>
int main(){ double a, s; int k; scanf(«%lf»,&a); k = 1; s = 1; while (s<a) { s = s + 1.0/k; k = k + 1; } printf(«%d», k); return 0; } |
Последовательно выполните следующее.
1. Напишите, что выведет эта программа при вводе числа 1.2.
2. Приведите пример числа, при вводе которого программа даст верный ответ.
3. Найдите в программе все ошибки (их может быть одна или несколько).
Для каждой ошибки выпишите строку, в которой она допущена, и приведите эту же строку в исправленном виде.
Обратите внимание: вам нужно исправить приведённую программу, а не написать свою. Вы можете только исправлять ошибочные строки; удалять строки или добавлять новые строки нельзя. Постарайтесь также не внести новые ошибки – за это оценка снижается.
Решение:
Решение использует запись программы на Паскале. Допускается использование программы на других языках.
1. При вводе числа 1.2 программа выведет число 2.
2. Примеры чисел, при вводе которых программа выводит верный ответ: 1.6, 2.05.
Программа содержит две ошибки, одна из которых приводит к увеличению ответа, другая – к уменьшению.
В некоторых случаях эти ошибки компенсируют друг друга, и ответ оказывается правильным. Это происходит, если значение A попадает в один из следующих диапазонов: 1.5 < A < 1.83, 2 < A < 2.08.
3. Программа содержит две ошибки.
1) Неверная инициализация. Начальное значение S должно быть равно нулю.
В приведённом варианте вычисленная сумма оказывается на 1 больше правильного значения.
Строка с ошибкой:
s := 1;
Правильная строка:
s := 0;
2) Неверное определение ответа. Приведённая программа находит не максимальное K, при котором выполняется неравенство, а минимальное, при котором оно не выполняется, то есть увеличивает верное значение на 1.
Кроме того, использованный порядок действий в цикле (увеличение K после увеличения S) приводит к увеличению ещё на 1. Это можно было бы исправить, изменив порядок действий в цикле и уменьшив K после завершения цикла, но эти действия не разрешены по условию задачи.
Поэтому для исправления ошибки можно просто скорректировать значение при выводе.
Строка с ошибкой:
write(k);
Правильная строка:
write(k-2);
Спасибо за то, что пользуйтесь нашими материалами.
Информация на странице «Задача №24. Исправление ошибок в программе.» подготовлена нашими редакторами специально, чтобы помочь вам в освоении предмета и подготовке к ЕГЭ и ОГЭ.
Чтобы успешно сдать нужные и поступить в высшее учебное заведение или техникум нужно использовать все инструменты: учеба, контрольные, олимпиады, онлайн-лекции, видеоуроки, сборники заданий.
Также вы можете воспользоваться другими статьями из разделов нашего сайта.
Публикация обновлена:
07.06.2023