#include <iostream>
#include <conio.h> // для _getch()
#include <clocale> // для погдключения русской локали
#include <string.h>
#include <stdio.h> //strcat
using namespace std;
int main(int argc, char *argv[]) {
std::setlocale(LC_ALL, "Russian_Russia.1251");
char* slovo1 = " proger ";
char* slovo2 = " riger ";
//strcpy (slovo1,slovo2);
strcat (slovo1, slovo2);
printf(slovo1);
//printf("прива");
cout << "\n" << slovo1<< "\n";
printf("прива");
std::cout << " Press <Enter> ... ";
_getch();
return 0;
}
Необработанное исключение в "0x003fd2e9 (msvcr100d.dll)" в "test1.exe": 0xC0000005: Нарушение прав доступа при записи "0x00a47868".
Проблема в строчке
strcat (slovo1, slovo2);
Функция strcat
присоединяет к строке, переданной первым параметром, строку, переданную вторым параметром. В данном случае строки - это массивы элементов типа char
. В C++ массивы не являются динамическими структурами, то есть не могут изменять свой размер во время выполнения программы. Поэтому в массиве (строке), переданном первым параметром в strcat
, должно быть достаточно места, чтобы туда поместились обе строки. Объявляя строку так
char* slovo1 = " proger ";
вы создаёте массив char
'ов размером ровно в длину строки " proger "
(плюс один элемент под нуль-терминатор). Если вы хотите сложить две строки, вам придётся выделить память под результат:
cahr* slovo = new char[strlen(slovo1) + strlen(slovo2) + 1];
strcat(slovo, slovo1);
strcat(slovo, slovo2);
printf(slovo);
Есть и другие способы. Например, с использованием класса stringstream
:
stringstream ss;
ss << slovo1 << slovo2;
printf(ss.str().c_str()); // ну, или cout << ss;
Или используя класс string
:
string slovo1 = " proger ";
string slovo2 = " riger ";
slovo1 = slovo1 + slovo2;
cout << slovo1;
Вы либо пишите на С++, либо на С. У вас же какая-то каша. Если это С, то для указателей char* выделяйте память, используйте правильно printf, или же puts вместо неё для вывода. Если С++, то конкатенация строки сделайте как string и конкатенация +. Обращайте внимание на то, что говорит компилятор в процессе компиляции, g++ на вашу программу выдал следующее, это как раз о том, что я выше написал:
main.cpp:10:22: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
char* slovo1 = " proger ";
^
main.cpp:11:22: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
char* slovo2 = " riger ";
^
main.cpp:15:18: warning: format not a string literal and no format arguments [-Wformat-security]
printf(slovo1);
Это все, конечно, верно, но реальная причина ошибки заключается в попытке записи в область констант.
Обычно (как в этом случае) эта область памяти имеет защиту от модификации.
--
@timob256, достаточно написать (не скажу, что так надо программировать)
char proger[100 /* достаточно большое число */] = " proger ",
*slovo1 = proger, *slovo2 = " riger ";
и данная ошибка исчезнет.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Прошу, подскажите, мне нужно перенести весь текст элемента ListBox в другойЭтот код переносит почему-то только часть текста:
Задача очень распространенная, но не могу найти реализации на QT 5x