Я пытаюсь выполнить функцию strcat_s и сбой приложения. Как работать с этим кодом?strcats func crashing application
char *test = "hello ";
strcat_s(test, strlen(test), "guys");
// like output "hello guys" but application crashing...
Я пытаюсь выполнить функцию strcat_s и сбой приложения. Как работать с этим кодом?strcats func crashing application
char *test = "hello ";
strcat_s(test, strlen(test), "guys");
// like output "hello guys" but application crashing...
Поскольку вы пишете C++, вы должны использовать std::string
, не char*
.
std::string test = "hello ";
test += "guys;
И если вам нужно передать эту строку в существующий код C++ в качестве указателя, используйте c_str()
метод:
extern void foo(const char*);
foo(test.c_str());
указатель тест указывает на память только для чтения. Модификация памяти только для чтения приводит к сбою приложения.
Это будет работать:
char test[128];
strcpy(test, "hello ");
strcat_s(test, strlen(test), "guys");
Вам не нужен strcpy() - 'char test [128] =" hello ";' выполняет задание. –
Вы пытаетесь изменить строковый литерал. Это недопустимо.
Ваш компилятор должен хотя бы предупредить вас об этом char* test
, который должен быть const char* test
для обеспечения неизменности. На самом деле, поскольку C++ 11, ваш код даже не компилируется!
В 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;
И это будет прекрасно работать.
Технически, в C++ 03 (который OP должен использовать), это устаревшее преобразование, которое следует (позже) неопределенной мутацией. Так как C++ 11, инициализация плохо сформирована. –
@LightnessRacesinOrbit Должен ли я добавить это? Я просто вычислил, поскольку он был помечен C++, я должен ответить, используя текущий стандарт. – NathanOliver
Да, я так думаю - ясно, что OP не использует C++ 11, так сказать, плохо сформированный код вводит в заблуждение :) –
Почему вы используете 'strcat' в коде на C++? Использование 'std :: string' будет намного проще. –
Я не работаю с дополнительными библиотеками. –
@ EminFurkanTürkmen: 'std :: string' не является дополнительной библиотекой. Это часть C++. Если вы не находитесь на встроенной платформе без средств библиотеки C++, ваш код не будет проходить проверку кода в моей команде. –