Как сложить две строки?

348
15 декабря 2016, 16:10
#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".

Answer 1

Проблема в строчке

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;
Answer 2

Вы либо пишите на С++, либо на С. У вас же какая-то каша. Если это С, то для указателей 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);
Answer 3

Это все, конечно, верно, но реальная причина ошибки заключается в попытке записи в область констант.

Обычно (как в этом случае) эта область памяти имеет защиту от модификации.

--

@timob256, достаточно написать (не скажу, что так надо программировать)

 char proger[100 /* достаточно большое число */] = " proger ",
   *slovo1 = proger, *slovo2 = " riger ";

и данная ошибка исчезнет.

READ ALSO
Перенос текста из одного ListBox в другой

Перенос текста из одного ListBox в другой

Прошу, подскажите, мне нужно перенести весь текст элемента ListBox в другойЭтот код переносит почему-то только часть текста:

255
Узнать заряд батареи на Android

Узнать заряд батареи на Android

Задача очень распространенная, но не могу найти реализации на QT 5x

261