Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.01.2019, 20:40   #1
Shystrik_21
Новичок
Джуниор
 
Регистрация: 23.01.2019
Сообщений: 2
По умолчанию strcpy_s. Помогите найти ошибку.

Всем привет. имеется програмка, но я не понимаю своей ошибки.
Код:
#include "stdafx.h"
#include <iostream>
#include <string.h>
#include <stdlib.h>

using namespace std;

class String
{
private:
	enum { SZ = 80 };
	char str[SZ];
public:
	String()
	{ strcpy_s(str, "");}

	String(const char* s)
	{ strcpy_s(str, s);}

	void display() const
	{ cout << str;}

	String operator + (String ss) const
	{
		String temp;
		if (strlen(str) + strlen(ss.str) < SZ)
		{
			strcpy_s(temp.str, _countof(temp.str), str);
			strcpy_s(temp.str, _countof(temp.str), ss.str);
		}
		else
		{
			cout << "\nПереполнение!";
			exit(1);
		}
		return temp;
	}
};
///////////////////////////////////////////////////////////
int main()
{
	setlocale(LC_ALL, "RUS");
	String s1("\nC Рождеством! ");
	String s2 = "\nC Новым годом!";
	String s3;

	s1.display();
	s2.display();
	s3.display();

	s3 = s1 + s2;

	s3.display();
	cout << endl;

	cerr << "Отработал\n";
	system("pause");
    return 0;
}
В этом месте происходит затирка:
Код:
if (strlen(str) + strlen(ss.str) < SZ)
		{
			strcpy_s(temp.str, _countof(temp.str), str);
			strcpy_s(temp.str, _countof(temp.str), ss.str);
		}
Т.е. первое копирование затирается вторым.
Этот код работает норм:
Код:
#include "stdafx.h"
#include <string.h>     // for strcpy_s, strcat_s
#include <stdlib.h>     // for _countof
#include <stdio.h>      // for printf
#include <errno.h>      // for return values
#include <iostream>


using namespace std;

int main()
{
	char string[80];

	strcpy_s(string, _countof(string), "Hello world from ");
	strcat_s(string, _countof(string), "strcpy_s ");
	strcat_s(string, _countof(string), "and ");
	strcat_s(string, _countof(string), "strcat_s!");

	printf("String = %s\n", string);
	system("pause");
    return 0;
}
Что я не понимаю? Спасибо.

Последний раз редактировалось Shystrik_21; 23.01.2019 в 20:43.
Shystrik_21 вне форума Ответить с цитированием
Старый 23.01.2019, 20:51   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

strcpy_s и strcat_s разные функции, делающие разные вещи
p51x вне форума Ответить с цитированием
Старый 23.01.2019, 20:57   #3
Shystrik_21
Новичок
Джуниор
 
Регистрация: 23.01.2019
Сообщений: 2
По умолчанию

Вот я осёл. Пойду просплюсь.
Shystrik_21 вне форума Ответить с цитированием
Старый 23.01.2019, 23:43   #4
migmile
Новичок
Джуниор
 
Регистрация: 23.01.2019
Сообщений: 2
По умолчанию

мне казалось, что логичнее
вместо
enum { SZ = 80 };
использовать
const size_t SZ=80;
да и второй конструктор небезопасен без проверки длины s
migmile вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[C++] найти сумму ряда , посчитать функцию ch(x) и найти абсолютную и относительную погрешности. Помогите найти ошибку! Vladonna Помощь студентам 2 13.09.2018 22:07
Помогите, пожалуйста, найти ошибку в коде (найти сумму факториалов чётных чисел в заданном диапазоне) kris14 Паскаль, Turbo Pascal, PascalABC.NET 8 25.10.2017 15:42
Дан массив а(n) типа SWORD. найти сумму всех отрицательных элементов массива.помогите найти ошибку Юлия123456 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 07.09.2016 06:12
Найти седловые точки в матрице(помогите найти ошибку) - pascal tdsotm Помощь студентам 0 20.11.2014 18:57
Помогите найти ошибку - StrToFloat выдаёт ошибку EConvertError для ячеек StringGrid (Delphi) Artsiom Помощь студентам 10 18.12.2013 14:10