Форум программистов, компьютерный форум CyberForum.ru

strcpy - как быть? - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ несколько файлов *.html открыть программно http://www.cyberforum.ru/cpp-beginners/thread353810.html
Здравствуйте, подскажите пожалуйста, имеется несколько файлов *.html, как их открыть программно, чтобы они отображались в одном Internet Explorer на разных вкладках??? Ответ есть, никто не знает как с СИ++ в ВБ(А) сделать var navOpenInBackgroundTab = 0x1000; var oIE = new ActiveXObject("InternetExplorer.Application"); oIE.Navigate2("http://blogs.msdn.com");...
C++ Односвязный список: где-то закралась ошибка Не могу найти где ошибка и всё тут, наверняка ошибка глупая и я её попросту не замечаю. Сам класс список: class List { struct element { element(string s, element *next=NULL) { http://www.cyberforum.ru/cpp-beginners/thread353809.html
C++ мне нужна помощь по курсовой работе!!!
(Делать нужно на С++) Задание такое: Задан массив натуральных чисел P. Найти минимальное натуральное число, не представимое суммой никаких элементов массива P. Сумма может состоять из одного слогаемого, но каждый элемент массива может входить в неё только 1 раз. Добавлено через 1 час 51 минуту а всё, кажись разобрался=)
C++ Двумерный массив
Доброго времени суток. Все вроде запускается но есть две проблемы, все пишет в строчку а не квадратной матрицей и не может идентифицировать "j". Не исключено что я прикрутил что то лишнее или недокрутил. /*21. Найти наибольший и наименьший элементы прямоугольной матрицы и поменять их местами. */ #include "stdafx.h" #include <stdlib.h> #include <iostream> #include <conio.h>
C++ Алгоритмы и методы http://www.cyberforum.ru/cpp-beginners/thread353790.html
Надо записать на С++(желательно Borland 5.02) алгоритмы и методы: 1.Алгоритм разделенных корней 2.Метод простых итераций 3.Метод касаемых(Ньютона) 4.На ваше усмотрение(любой метод или алгоритм).
C++ Вопрос по одномерным массивам. Всем доброго времени суток. 1. Написал код но при запуске выкидывает ошибку и условия не считает. В одномерном массиве формируемом случайно элементами как отриц. так и положит. нужно подсчитать кол-во этих элементов в отдельности. (отриц. = (), полож. = (), нулевых=()) #include "stdafx.h" #include <iostream> using namespace std; int main() { подробнее

Показать сообщение отдельно
Nameless One
Эксперт С++
 Аватар для Nameless One
5759 / 3408 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
21.09.2011, 15:34     strcpy - как быть?
Цитата Сообщение от prik Посмотреть сообщение
Может покажите пример?
Начнем с того, что размер памяти, выделенный под массив динамически, ни С, ни в С++ узнать нельзя.
При передаче же статического массива в функцию strcpy происходит неявное преобразование к указателю на char* (т.е., по сути char dest[80] и char* dest - разные вещи). В качестве примера можешь посмотреть результат работы следующей программы:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
#include <stdlib.h>
 
#define SIZE(ptr) sizeof(ptr) / sizeof(*ptr)
 
char* mystrcpy(char* dest, const char* src)
{
    printf("Allocated %u bytes for the destination string\n", SIZE(dest));
    
    char* result = dest;
    while(*dest++ = *src++);
    return result;
}
 
int main()
{
    char dest[80];
    const char* src = "Hello, strcpy!";
        
    printf("Allocated %u bytes for the destination string\n", SIZE(dest));
    mystrcpy(dest, src);
    printf("After copying: %s\n", dest);
    
    exit(0);
}
То есть, хотя мы можем внутри функции узнать число символов, которые содержит массив src, но мы не можем узнать допустимый объем памяти, который выделен (статически или динамически) для dest, значит, не можем и отследить переполнение dest.
В C++ есть хитрый трюк, который позволяет с помощью шаблонов узнать размер статического массива:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
 
template<size_t N>
char* mystrcpy(char (&dest)[N], const char* src)
{
    std::cout << "dest is " << N << " bytes long" << std::endl;
 
    char* ptr = dest;
    
    while(*ptr++ = *src++);
    
    return dest;
}
 
int main()
{
    char* src = "Hello, template hacks!";
    char dest[80];
    mystrcpy(dest, src);
    std::cout << dest << std::endl;
    
    return 0;
}
Кстати, если я правильно помню, одна из перегрузок strcpy_s как раз-таки написана подобным образом.
 
Текущее время: 04:25. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru