Мой strcpy_s не будет работать с моим указателем char *, почему?

Итак, я пытаюсь исправить свое назначение C++, но когда я использую strcpy_s, он работает только для моего массива, а не для моего * указателя. Вот с чем я работаю:

HotelRoom::HotelRoom(char Num[], int cap, double daily, char* name, int Stat)
{
strcpy_s(room_Num, Num); //copy first argument into room_Num[]
guest = new char[strlen(name) +1]; //create space for the name
strcpy_s(guest, name); //copy second argument into new space
capacity = cap;
dailyRate = daily;
occupancyStat = Stat;
}

Это ошибка, которую я получаю при использовании таким образом strcpy_s(guest, name); :

"Ни один экземпляр перегруженной функции "strcpy_s" не соответствует типам аргументов списка аргументов: (char*, char*)".


person SyntaxEyes    schedule 22.11.2013    source источник
comment
Вероятно, бесполезный вопрос, но почему вы не используете строку?   -  person Nil    schedule 22.11.2013
comment
другая сигнатура функции? msdn.microsoft.com/en-us/library /td1esda9(v=vs.90).aspx   -  person kenny    schedule 22.11.2013
comment
@Nil, потому что в задании книги сказано использовать char* и Char[]   -  person SyntaxEyes    schedule 22.11.2013
comment
@kenny, я прочитал этот сайт, прежде чем публиковать здесь; и я не понимаю, что он говорит. Вот почему я пишу здесь. Я начинающий.   -  person SyntaxEyes    schedule 22.11.2013
comment
@SyntaxEyes посмотрите на ответ Ю ниже. Он имеет другие аргументы или сигнатуру стандартного strcpy() или ранее.   -  person kenny    schedule 22.11.2013


Ответы (3)


Нестандартный strcpy_s принимает один дополнительный параметр, чем std::strcpy, который является максимальным размером, который вы хотите скопировать.

errno_t strcpy_s(char *s1, size_t s1max, const char *s2);

Вам нужна стандартная функция C std::strcpy.

char *strcpy(char *s1, const char *s2);
person Yu Hao    schedule 22.11.2013
comment
когда я использую: char *strcpy(char *s1, const char *s2); он выводит кучу символов, таких как ==^&%$@. Но когда я использую: - person SyntaxEyes; 22.11.2013
comment
но когда я использую: strcpy_s(char *s1, size_t s1max, const char *s2); он работает, но в конце компиляции выдает ошибку с брейком или что-то в этом роде. - person SyntaxEyes; 22.11.2013
comment
@SyntaxEyes Строки в стиле C должны заканчиваться нулем, убедитесь в этом. Или лучше используйте std::string, если это возможно. - person Yu Hao; 22.11.2013
comment
@YuHao, FYI strcpy_s — это стандартная функция C11: en.cppreference.com/w /c/строка/байт/strcpy. - person Annie; 24.03.2015
comment
@Энни И это вопрос на С++. - person Yu Hao; 24.03.2015

Взгляните на документацию: http://msdn.microsoft.com/en-us/library/td1esda9%28v=vs.90%29.aspx

Когда размер не может быть определен автоматически, потому что массив статических размеров не передается, вы должны указать его.

#include <string.h>

int main()
{
    char src[] = "Hello World!\n";
    char staticDest[100];
    size_t dynamicSize = strlen(src) + 1;
    char* dynamicDest = new char[dynamicSize];

    //Use the overload that can determine the size automatically
    //because the array size is fixed
    //template <size_t size> errno_t strcpy_s(char(&strDestination)[size], const char *strSource);
    strcpy_s(staticDest, src);

    //Use the overload that requires an additional size parameter because
    //the memory is dynamically allocated
    //errno_t strcpy_s(char *strDestination, size_t numberOfElements, const char *strSource);
    strcpy_s(dynamicDest, dynamicSize, src);

    return 0;
}
person Retired Ninja    schedule 22.11.2013
comment
разве это не то, что я здесь делаю: guest = new char[strlen(name) +1]; разве это не освобождает место для указателя на имя? - person SyntaxEyes; 22.11.2013
comment
Нет, так как вы динамически выделяете память, вы должны сообщить функции, насколько велик буфер назначения. Если у вас есть статический массив, такой как char s[100];, шаблонная перегрузка может автоматически определить размер. Я добавил пример обоих в ответ. - person Retired Ninja; 22.11.2013
comment
ОООО! Я понимаю. Хорошо, поэтому я использовал ваш второй пример с 3 аргументами, и теперь, после завершения компиляции, он выскакивает с ошибкой, в которой говорится о точке останова, а затем о прерывании, когда я нажимаю кнопку прерывания. - person SyntaxEyes; 22.11.2013
comment
Вы должны увидеть в отладчике строку, в которой произошла ошибка. Не видя всего вашего кода, трудно сказать, в чем может быть проблема. - person Retired Ninja; 22.11.2013
comment
В обоих этих вызовах strcpy_s код должен проверять возвращаемое значение. В противном случае он предлагает лишь небольшое преимущество перед простым вызовом strcpy: он заменяет переполнение буфера повреждением данных. - person Pete Becker; 22.11.2013
comment
Да, это просто демонстрация двух разных версий. В реальном коде важна проверка на наличие ошибок. - person Retired Ninja; 23.11.2013

Следующее должно работать:

strcpy_s(guest, strlen(name), name); //copy second argument into new space
person Anuj    schedule 01.03.2016