2017-02-10 2 views
-1

Я пытаюсь выполнить функцию strcat_s и сбой приложения. Как работать с этим кодом?strcats func crashing application

char *test = "hello "; 
strcat_s(test, strlen(test), "guys"); 
// like output "hello guys" but application crashing... 
+3

Почему вы используете 'strcat' в коде на C++? Использование 'std :: string' будет намного проще. –

+0

Я не работаю с дополнительными библиотеками. –

+3

@ EminFurkanTürkmen: 'std :: string' не является дополнительной библиотекой. Это часть C++. Если вы не находитесь на встроенной платформе без средств библиотеки C++, ваш код не будет проходить проверку кода в моей команде. –

ответ

3

Поскольку вы пишете C++, вы должны использовать std::string, не char*.

std::string test = "hello "; 
test += "guys; 

И если вам нужно передать эту строку в существующий код C++ в качестве указателя, используйте c_str() метод:

extern void foo(const char*); 
foo(test.c_str()); 
1

указатель тест указывает на память только для чтения. Модификация памяти только для чтения приводит к сбою приложения.

Это будет работать:

char test[128]; 
strcpy(test, "hello "); 
strcat_s(test, strlen(test), "guys"); 
+4

Вам не нужен strcpy() - 'char test [128] =" hello ";' выполняет задание. –

3

Вы пытаетесь изменить строковый литерал. Это недопустимо.

Ваш компилятор должен хотя бы предупредить вас об этом char* test, который должен быть const char* test для обеспечения неизменности. На самом деле, поскольку C++ 11, ваш код даже не компилируется!

3

В C++ 03

char *test = "hello "; 

Является устаревшим преобразование const char[N] в char*. Попытка изменить его с помощью strcat - это неопределенное поведение.

В C++ 11 и выше У вас плохо сформированный код.

char *test = "hello "; 

Не является законным C++. Тип "hello " - const char[N]. Это означает, что при вызове strcat вы пытаетесь изменить постоянную строку. Если вы повысите свой уровень предупреждения до компилятора, сообщите об этом.

Вы действительно должны использовать std::string и тогда вы могли бы

std::string test = "hello "; 
test += "guys; 

И это будет прекрасно работать.

+0

Технически, в C++ 03 (который OP должен использовать), это устаревшее преобразование, которое следует (позже) неопределенной мутацией. Так как C++ 11, инициализация плохо сформирована. –

+0

@LightnessRacesinOrbit Должен ли я добавить это? Я просто вычислил, поскольку он был помечен C++, я должен ответить, используя текущий стандарт. – NathanOliver

+0

Да, я так думаю - ясно, что OP не использует C++ 11, так сказать, плохо сформированный код вводит в заблуждение :) –