Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Использование strcat_s и strcpy_s


Автор: FiMa1 8.1.2008, 07:52
Доброго времени суток, друзья!

Спешу всех поздравить с прошедшим Рождеством и поменьше вам проблем в профессиональном и личном планах!

У меня такой вопрос: почему первый вариант в коде, приведенном ниже, работает, второй нет? У кого какие идеи? Заранее спасибо!
Код

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>

int main( void )
{
    // это работает
    char s_str[100];
    strcpy_s(s_str, "hello ");
    strcat_s(s_str, "_");

    // это не работает
    char *d_str = new char[100];
    // 'strcpy_s' : function does not take 2 arguments
    strcpy_s(d_str, "hello ");
    // 'strcat_s' : function does not take 2 arguments
    strcat_s(d_str, "_");

    delete[] d_str;
}


Цитата

Append a string. These are versions of strcat, wcscat, _mbscat with security enhancements as described in Security Enhancements in the CRT.
errno_t strcat_s(
   char *strDestination,
   size_t sizeInByte,
   const char *strSource
);
...


Автор: MTWizard 8.1.2008, 09:35
Потому, что в первом случае тип аргумента - char[], и используется другая версия функции:
Код

template <size_t size>
errno_t strcpy_s(
   char (&strDestination)[size],
   const char *strSource 
); // C++ only


Она не принимает размера, т.к. может вычислить его самостоятельно. Во втором же случае используется указанная тобой версия, и в неё нужно добавить второй параметр - размер массива.

Автор: FiMa1 8.1.2008, 09:56
Цитата(MTWizard @ 8.1.2008,  09:35)
Потому, что в первом случае тип аргумента - char[], и используется другая версия функции:
Код

template <size_t size>
errno_t strcpy_s(
   char (&strDestination)[size],
   const char *strSource 
); // C++ only


Она не принимает размера, т.к. может вычислить его самостоятельно. Во втором же случае используется указанная тобой версия, и в неё нужно добавить второй параметр - размер массива.

MTWizard, большое спасибо за быстрый и точный ответ!

Автор: FiMa1 8.1.2008, 10:19
Ребята, а не могли бы вы подсказать как шаблонная функция извлекает размер массива. Я понимаю, что размер статического массива хранится в нем самом, но под отладчиком не вижу его:
Код

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>

template <size_t size>
errno_t func(char(&str)[size])
{
    for(int i = 0; i < size; ++i)
        // выполняется 6 раз, т.е. '\0' тоже печатается
        printf("%c", str[i]);
    printf("\n");
}

int main( void )
{
    char str[] = "hello";
    int slen = strlen(str); // slen = 5
    func(str);

Под отладчиком:
Код

0x0012FF58  68 65 6c 6c 6f 00 cc cc cc cc cc cc 24 74 39 be b8 ff 12 00 86 1a  hello.ММММММ$t9ѕёя....
0x0012FF6E  41 00 01 00 00 00 50 2f 35 00 f8 32 35 00 f4 74 39 be 00 00 00 00  A.....P/5.ш25.фt9ѕ....
0x0012FF84  9c f9 91 09 00 b0 fd 7f 99 9e 36 00 00 00 00 00 00 00 00 00 00 00  њщ‘..°э.™ћ6...........


0x0012FF84  9c f9 91 09 00 b0 fd 7f 99 9e 36 00 00 00 00 00 00 00 00 00 00 00  њщ‘..°э.™ћ6...........

Автор: Daevaorn 8.1.2008, 10:59
Цитата(FiMa1 @  8.1.2008,  11:19 Найти цитируемый пост)
Ребята, а не могли бы вы подсказать как шаблонная функция извлекает размер массива. 

Никак. Его запоминает компилятор.

Цитата(FiMa1 @  8.1.2008,  11:19 Найти цитируемый пост)
Я понимаю, что размер статического массива хранится в нем самом, но под отладчиком не вижу его:

Не хранится.

Автор: Fazil6 8.1.2008, 11:25
Цитата(FiMa1 @  8.1.2008,  09:19 Найти цитируемый пост)
Ребята, а не могли бы вы подсказать как шаблонная функция извлекает размер массива. Я понимаю, что размер статического массива хранится в нем самом, но под отладчиком не вижу его:

она его не извлекает. Она принимает ссылку на массив и в случае ссылки размер известен - это size

Автор: FiMa1 8.1.2008, 11:47
Fazil6, Daevaorn, большое спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)