Выбрать главу

Ответ находится в четвёртой переменной. Дело в том, что длина этих двух строк не 16 символов, а 17! Программа не выделила память для завершающего нуля, что и приводит к сбою при выполнении функции StringEmUp( ).

 

«Длина строки всегда включает завершающий нулевой символ.»

[Помни!]

Давайте изменим программу, исправив ошибку. Пусть теперь С++ сам рассчитывает размер строк. Получившаяся в результате программа Concatenate2.срр, приведённая ниже, работает вполне корректно.

    /* Concatenate — конкатенация двух строк со вставкой " - " между ними. */

    #include <cstdio>

    #include <cstdlib>

    #include <iostream>

    #include <string.h>

    using namespace std ;

    void StringEmUp( char* szTarget ,

                                char* szSource1 ,

                                char* szSource2 ) ;

    int main( int nNumberofArgs , char* pszArgs[ ] )

    {

            /* печать кириллицы, если Вы не установите программки gccrus.exe и g++rus.exe */

            setlocale (LC_ALL,".1251"); 

        cout << "Конкатенация двух строк со вставкой \" - \"\n"

                << "( В этой версии нет ошибки. )" << endl ;

        char szStrBuffer[ 256 ] ;

        /* Определение двух строк... */

        char szString1[ ] = "This is a string" ;

        char szString2[ ] = "THIS IS A STRING" ;

        /* ...и объединение их в одну */

        StringEmUp( szStrBuffer ,

                            szString1 ,

                            szString2 ) ;

        /* Вывод результата */

        cout << "<" << szStrBuffer << ">" << endl ;

        /* Пауза для того, чтобы посмотреть на результат работы программы */

        system( "PAUSE" ) ; return 0 ;

    }

_________________

140 стр. Часть 2. Становимся функциональными программистами

    void StringEmUp( char* szTarget ,

                                char* szSource1 ,

                                char* szSource2 )

    {

        strcpy( szTarget , szSource1 ) ;

        strcat( szTarget , " - " ) ;

        strcat( szTarget , szSource2 ) ;

    }

Вот вывод этой программы — именно такой, какой мы и ожидали:

    Конкатенация двух строк со вставкой " - "

    ( В этой версии нет ошибки. )

    <This is a string - THIS IS A STRING>

    Press any key to continue...

! ! ! ! ! ! ! ! ! ! ! ! ! !

    Поздравляю! Вам удалось отладить программу.

! ! ! ! ! ! ! ! ! ! ! ! ! !

_________________

141 стр. Глава 10. Отладка программ на С++

Часть 3. ВВЕДЕНИЕ В КЛАССЫ...143

ОГЛАВЛЕНИЕ

СОДЕРЖАНИЕ  

Глава 11. ЗНАКОМСТВО С ОБЪЕКТНО-ОРИЕНТИРОВАННЫМ ПРОГРАММИРОВАНИЕМ...145

Глава 12. КЛАССЫ В С++...149

Глава 13. РАБОТА С КЛАССАМИ...154

Глава 14. УКАЗАТЕЛИ НА ОБЪЕКТЫ...167

Глава 15. ЗАЩИЩЁННЫЕ ЧЛЕНЫ КЛАССА: НЕ БЕСПОКОИТЬ!...181

Глава 16. СОЗДАНИЕ И УДАЛЕНИЕ ОБЪЕКТОВ...188

Глава 17. АРГУМЕНТАЦИЯ КОНСТРУИРОВАНИЯ...198

Глава 18. КОПИРУЮЩИЙ КОНСТРУКТОР...213

Глава 19. СТАТИЧЕСКИЕ ЧЛЕНЫ...224

        В этой части...

Основным отличием С++ от других языков является возможность объектно-ориентированного программирования. Термин объектно-ориентарованный — один из самых популярных в современном компьютерном мире. Языки программирования, редакторы и базы данных — буквально все претендуют на звание объектно-ориентированных. Иногда так оно и есть, но часто такое определение даётся исключительно в рекламных целях.