Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Использование strcat_s и strcpy_s, Проблема исп-я с динамическими массивами 
V
    Опции темы
FiMa1
Дата 8.1.2008, 07:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 23.9.2006

Репутация: 5
Всего: 6



Доброго времени суток, друзья!

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

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

#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
);
...


PM   Вверх
MTWizard
Дата 8.1.2008, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 8.10.2007
Где: Київ

Репутация: 3
Всего: 4



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

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


Она не принимает размера, т.к. может вычислить его самостоятельно. Во втором же случае используется указанная тобой версия, и в неё нужно добавить второй параметр - размер массива.
PM MAIL   Вверх
FiMa1
Дата 8.1.2008, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 23.9.2006

Репутация: 5
Всего: 6



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

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


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

MTWizard, большое спасибо за быстрый и точный ответ!
PM   Вверх
FiMa1
Дата 8.1.2008, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 23.9.2006

Репутация: 5
Всего: 6



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

#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...........
PM   Вверх
Daevaorn
Дата 8.1.2008, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



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

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

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

Не хранится.
PM MAIL WWW   Вверх
Fazil6
Дата 8.1.2008, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



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

она его не извлекает. Она принимает ссылку на массив и в случае ссылки размер известен - это size
PM MAIL   Вверх
FiMa1
Дата 8.1.2008, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 23.9.2006

Репутация: 5
Всего: 6



Fazil6Daevaorn, большое спасибо!
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0928 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.