Объединение строк
От: Lord Carlsberg Россия  
Дата: 07.09.06 05:33
Оценка:
Доброго всем времени суток. Сразу прошу прощения за "ламерский" вопрос — с сишником работаю недавно. При работе с чужими исходниками наткнулся на следующий кусок кода:
...
const char SHORT_VERSION_STRING[256]="2.1.1";
const char COPYRIGHT_STRING[256]="(C) Copyright bla-bla-bla";
...
/*____________________________________________________________________________
    Return a C string of the form:

    "Version 2.0 (C) Copyright bla-bla-bla"
____________________________________________________________________________*/

ErrCode 
GetVersionString( char theString[ 256 ] )
{
    static const char kVersionString[] =
        "Version " SHORT_VERSION_STRING " " COPYRIGHT_STRING;
...
}

Из этого я понял, что в kVersionString должно хранится объединение строк "Version ", SHORT_VERSION_STRING, " " и COPYRIGHT_STRING. Однако, при компилляции на MS VC++ 2005 компиллятор на данную конструкцию заругался следующим образом:
syntax error : missing ';' before identifier 'SHORT_VERSION_STRING'
syntax error : missing ';' before 'string'
syntax error : missing ';' before identifier 'COPYRIGHT_STRING'

Я попытался отредактировать исходник следующим образом:
...
const char SHORT_VERSION_STRING[256]="2.1.1";
const char COPYRIGHT_STRING[256]="(C) Copyright bla-bla-bla";
...
/*____________________________________________________________________________
    Return a C string of the form:

    "Version 2.0 (C) Copyright bla-bla-bla"
____________________________________________________________________________*/

ErrCode 
GetVersionString( char theString[ 256 ] )
{
    static const char kVersionString[] =
        strcat(strcat(strcat("Version ", SHORT_VERSION_STRING), " "), COPYRIGHT_STRING);
...
}

На этот раз компиллятор выдал такую ошибку: error C2099: initializer is not a constant.
Тогда я убрал из объявления kVersionString спецификатор static, чтобы kVersionString объявлялась как автоматическая переменная (на MSDN написано, что ошибка initializer is not a constant возникает только при работе с неавтоматическими переменными). На сей раз при компилляции возникла ошибка: error C2075: 'kVersionString' : array initialization needs curly braces. Насколько я понимаю, фигурные скобки требуются при инициализации массива только если массив инициализируется заданием значения каждого его элемента. Из чего я сделал вывод, что я вообще пошёл не тем путём.
Как можно решить эту задачу (объединение нескольких строк и сохранение результата объединения в другой строке)? При этом желательно как можно меньше менять исходник (в частности объявления переменных), т.к. любое такое изменение может повлечь какие-либо нежелательные последствия.
Заранее благодарен.
Re: Объединение строк
От: Master Yoda Великобритания  
Дата: 07.09.06 05:44
Оценка:
Здравствуйте, Lord Carlsberg, Вы писали:

...
#define SHORT_VERSION_STRING "2.1.1"
#define COPYRIGHT_STRING "(C) Copyright bla-bla-bla"
...
/*____________________________________________________________________________
    Return a C string of the form:

    "Version 2.0 (C) Copyright bla-bla-bla"
____________________________________________________________________________*/

ErrCode 
GetVersionString( char theString[ 256 ] )
{
    static const char kVersionString[] =
        "Version " SHORT_VERSION_STRING " " COPYRIGHT_STRING;
...
}
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re: Объединение строк
От: Alex_Avr Россия  
Дата: 07.09.06 06:14
Оценка:
Здравствуйте, Lord Carlsberg, Вы писали:

LC>Я попытался отредактировать исходник следующим образом:

LC>
LC>...
LC>const char SHORT_VERSION_STRING[256]="2.1.1";
LC>const char COPYRIGHT_STRING[256]="(C) Copyright bla-bla-bla";
LC>...
LC>/*____________________________________________________________________________
LC>    Return a C string of the form:

LC>    "Version 2.0 (C) Copyright bla-bla-bla"
LC>____________________________________________________________________________*/

LC>ErrCode 
LC>GetVersionString( char theString[ 256 ] )
LC>{
LC>    static const char kVersionString[] =
LC>        strcat(strcat(strcat("Version ", SHORT_VERSION_STRING), " "), COPYRIGHT_STRING);
LC>...
LC>}
LC>

LC>На этот раз компиллятор выдал такую ошибку: error C2099: initializer is not a constant.
LC>Тогда я убрал из объявления kVersionString спецификатор static, чтобы kVersionString объявлялась как автоматическая переменная (на MSDN написано, что ошибка initializer is not a constant возникает только при работе с неавтоматическими переменными). На сей раз при компилляции возникла ошибка: error C2075: 'kVersionString' : array initialization needs curly braces. Насколько я понимаю, фигурные скобки требуются при инициализации массива только если массив инициализируется заданием значения каждого его элемента. Из чего я сделал вывод, что я вообще пошёл не тем путём.

Проблема в том, что так массивы инициализировать можно только константами времени компиляции, т.е

char kVersionString[] = "(C) Copyright bla-bla-bla"; // так можно

char kVersionString2[] = getSomeString (); // а так нет, т.к. в момент компиляции неизвестно, что веренет
                                           // getSomeString ()


LC>Как можно решить эту задачу (объединение нескольких строк и сохранение результата объединения в другой строке)? При этом желательно как можно LC>меньше менять исходник (в частности объявления переменных), т.к. любое такое изменение может повлечь какие-либо нежелательные последствия.

Master Yoda уже привел хорошее решение.
Возможные проблемы могут быть только, если длина полной строки версии вместе с завершающим нулем превысит 256 символов.
Но чтобы учесть этот случай без переписывания этого кода не обойтись.
С уважением, Александр Авраменко.
Re: Объединение строк
От: Shmakov Россия  
Дата: 07.09.06 15:25
Оценка:
static const char szSHORT_VERSION_STRING [256] = "2.1.1";
static const char szCOPYRIGHT_STRING     [256] = "(C) Copyright bla-bla-bla";

char szVersion [256];
sprintf (szVersion, "Version %s %s", szSHORT_VERSION_STRING, szCOPYRIGHT_STRING);
Re[2]: Объединение строк
От: Shmakov Россия  
Дата: 07.09.06 15:26
Оценка:
Да и забыл....
[256] писать не надо под уже статически выделенные строки "", только под суммарную строку...

Здравствуйте, Shmakov, Вы писали:


static const char szSHORT_VERSION_STRING [] = "2.1.1";
static const char szCOPYRIGHT_STRING     [] = "(C) Copyright bla-bla-bla";

char szVersion [256];
sprintf (szVersion, "Version %s %s", szSHORT_VERSION_STRING, szCOPYRIGHT_STRING);
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.