Проблема с переводом Ansistring

Тема в разделе "Borland C++ Builder & Kylix", создана пользователем Mad_LIR, 6 дек 2006.

Статус темы:
Закрыта.
  1. Mad_LIR

    Mad_LIR Гость

    Есть такой код в C++ 5. В заремленой строке масив указателей на char задаёться статически. Мне нужно определять его динамически.
    Вот возникла дурацкая проблема с переводом 2-х AnsiString в char * sta[2].
    Код (Text):
    // char * sta[2] = {"servise.dll", "ShowForm"}; Это работает нормально


    AnsiString qw = "servise.dll";
    AnsiString qw1 = "ShowForm";
    char * sta[2];
    // sta[0]=qw.c_str(); - даёт "servise.~"
    // sta[1]=qw1.c_str(); - даёт "ShowForm~"
    // StrLCopy(sta[0], qw.c_str(), qw.Length()); - не работает
    // StrLCopy(sta[1], qw1.c_str(), qw1.Length()); - не работает
    ~ - квадрат :)

    Вопрос в том, что мне нужен именно массив указвтелей на char для передачи параметров. Help me please!
     
  2. Psixo

    Psixo Member

    Регистрация:
    21 июн 2006
    Сообщения:
    11
    Симпатии:
    0
    Код (Text):
    AnsiString str1 = "_Vivat!_";
    AnsiString str2 = "Aloxa!";

    char *p[2] = {str1.c_str(), str2.c_str()};

    cout<< p[0];
    cout<<"\n";
    cout<< p[1];
     
  3. Mad_LIR

    Mad_LIR Гость

    Я уже всё перепробовал. Это не работает. Результат будет тот же, с "квадратами". Последний символ лишний.
    Можно обойти через объявление двух char[20] - допустим. А потом уже на него дать указатель, но это просто не серьёзно. Может кто поможет и объяснит проблему. Почему не могу через StrLCopy или как правильно.

    Заранее благодарен.
     
  4. Kmet

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
    Код (Text):
     sta[0]=qw.c_str(); - даёт "servise.~"
    sta[1]=qw1.c_str(); - даёт "ShowForm~"
    должно ругаться на каст const char* к char*

    Код (Text):
    // StrLCopy(sta[0], qw.c_str(), qw.Length()); - не работает
    // StrLCopy(sta[1], qw1.c_str(), qw1.Length()); - не работает
    А память кто выделять будет? И чем не устраивает strcpy?
     
  5. Fossil Code

    Fossil Code Гость

    А почему не ?

    AnsiString qw = "servise.dll";
    AnsiString qw1 = "ShowForm";
    char * sta[2];
    sta[0]=&qw;
    sta[1]=&qw1;
     
  6. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Для: Fossil Code
    Только по-моему надо так:
    Код (Text):
    sta[0]=&qw[0];
    sta[1]=&qw1[0];
     
  7. Kmet

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
    Для: Fossil Code
    Потому при таком способе не гарантируется, что мы пролучим указатель на нультерменированную строку
     
  8. Psixo

    Psixo Member

    Регистрация:
    21 июн 2006
    Сообщения:
    11
    Симпатии:
    0
    Код (Text):
     AnsiString qw = "servise.dll";
    AnsiString qw1 = "ShowForm";
    char * sta[2];
    sta[0]=qw.c_str(); - даёт "servise.~"
    sta[1]=qw1.c_str(); - даёт "ShowForm~"
    Вот этот код,как ни странно,у меня работает вполне корректно.
     
  9. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Не знаю как для AnsiString, но для std::string (std::basic_string) в MSDN сказано:
     
  10. Kmet

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
    Для: Psixo
    этот код и должен работать. Но нормальный компилятор обязательно поругаеться на приведение типов от сonst char* к char*.
     
  11. BreakPointMAN

    BreakPointMAN Гость

    c_str() всего-навсего возвращает указатель на char*-буфер, в котором хранится строка, представляемая данным AnsiString'ом. И с ним надо быть поосторожнее... Тут вариантов того, что может произойти, - масса. Например:
    Код (Text):
    AnsiString a="Hello, ";
    AnsiString b="World!";
    char *c=(a+b).c_str(); // так делать нельзя!
    Безымянный объект типа AnsiString, полученный в результате конкатенации переменных a и b, является временным, он будет уничтожен после выполнения строки с инструкцией "char *c=(a+B).c_str();", а указатель c будет указывать неведомо куда (хотя, с первого взгляда, он должен указывать на строку "Hello, World!").

    Еще могут быть глюки, связанные с тем, что AnsiString поддерживает технологию "copy-on-write" - кажется, так это называется... %) Суть в том, что если две или более строк типа AnsiString имеют одинаковое содержимое, то они могут пользоваться одним и тем же буфером для хранения данных, т.е. буфер у них является разделяемым. Но как только нужно будет изменить какую-либо из этих строк, то под ее содержимое выделяется отдельный буфер, в который копируется предыдущее значение разделяемого буфера, и все операции ведутся уже с новым буфером, не затрагивая при этом старый. Тут тоже могут быть такие приколы, типа:

    Код (Text):
    AnsiString A="Hello, world!";
    AnsiString B=A;
    AnsiString C(B);

    char *cptr=A.c_str();
    cptr[0]='*';
    Ну и какой тут будет результат? Строки B и C будут содержать "Hello, world!", а строка A будет равна "*ello, world!"? Не-а! Все три строки будут равны "*ello, world!", ибо буфер один и тот же, и объект A класса AnsiString не узнал о том, что должен выделить отдельный кусок памяти под изменяемую строку, ибо изменяли мы ее не методами класса AnsiString, а напрямую образаясь к буферу.


    и т.д., и т.п. Поэтому, если в результате каких-то операций с AnsiString'ами нам, в конце концов, надо получить строку типа char*, то делать это надо как-то так:

    Код (Text):
    AnsiString X; // допустим, это - то, что нам надо заиметь в виде char*
    int L=X.Length(); // определяем длину строки
    char *cptr=new char[L+1]; // подготавливаем буфер, достаточный для хранения строки
    strcpy(cptr,X.c_str()); // копируем строку в буфер
    ...
    delete []cptr; // освобождаем память
     
Загрузка...
Похожие Темы - Проблема переводом Ansistring
  1. c0de3r
    Ответов:
    4
    Просмотров:
    109
  2. DobermannTT
    Ответов:
    10
    Просмотров:
    130
  3. SoulPaladin
    Ответов:
    3
    Просмотров:
    119
  4. Artael
    Ответов:
    1
    Просмотров:
    107
  5. ENSLER
    Ответов:
    0
    Просмотров:
    100
Статус темы:
Закрыта.

Поделиться этой страницей