Копирование char* в другой char*.
От: FelixK Австралия  
Дата: 19.04.08 06:24
Оценка:
Всем доброго времени суток!

Я тут пишу консольную програмку которая получает вкачестве пареметра имя дериктории и записывает его в переменную типа char*. Походу мне надо скопировать это в другую переменную типа char*. Я пробывал использовать strcpy(char*,char*). Но при дебаге получаю такую ошибку:

Unhandled exception at 0x102aecda (msvcr80d.dll) in testapp.exe: 0xC0000005: Access violation writing location 0x0045d73c.

Кроме того открывает файл strcat.asm.
Я пишу в VC++ 2005.

Подскажите, плиз, как быть. Может кто ссылочку подбросит на примерчик.
И, плиз, не бейте ногами, я давно в VC не писал.
Re: Копирование char* в другой char*.
От: andrey.desman  
Дата: 19.04.08 06:41
Оценка:
Здравствуйте, FelixK, Вы писали:

FK>Подскажите, плиз, как быть. Может кто ссылочку подбросит на примерчик.

FK>И, плиз, не бейте ногами, я давно в VC не писал.

Ты хоть код приведи И скажи зачем копируешь, и вообще на чем пишешь? C или C++? А то может тебе std::string лучше подойдет.

int main(int argc, char **argv)
{
    char *copy = 0;

    if (argc > 1)
    {
        copy = malloc(strlen(argv[1]));
        strcpy(copy, argv[1]);
    }

    // ... do something with copy

    free(copy);

    return 0;
}

int main(int argc, char **argv)
{
    std::string copy;

    if (argc > 1)
    {
        copy = std::string(argv[1]);
    }

    // ... do something with copy

    return 0;
}
Re: Копирование char* в другой char*.
От: LaptevVV Россия  
Дата: 19.04.08 06:44
Оценка:
Здравствуйте, FelixK, Вы писали:

FK>Всем доброго времени суток!


FK>Я тут пишу консольную програмку которая получает вкачестве пареметра имя дериктории и записывает его в переменную типа char*. Походу мне надо скопировать это в другую переменную типа char*. Я пробывал использовать strcpy(char*,char*). Но при дебаге получаю такую ошибку:


FK>
FK>Unhandled exception at 0x102aecda (msvcr80d.dll) in testapp.exe: 0xC0000005: Access violation writing location 0x0045d73c.
FK>

Скорее всего память для строки не выделена.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[2]: Копирование char* в другой char*.
От: FelixK Австралия  
Дата: 19.04.08 06:53
Оценка:
Здравствуйте, andrey.desman, Вы писали:


AD>Ты хоть код приведи И скажи зачем копируешь, и вообще на чем пишешь? C или C++? А то может тебе std::string лучше подойдет.


Я пишу на C++, компилятор VC++ 2005 (VC++ .Net Pro).

Но в любом случае огромное спасибо и гранд мерси. Я вроде начинаю соображать где собака порылась.
Если будут ещё какие-нибудь советы или примеры на эту тему, то я буду очень рад посмотреть ещё варианты.

И всё таки, огромное спасибо за помощь и за время потраченное на мой вопрос.
Re[2]: Копирование char* в другой char*.
От: FelixK Австралия  
Дата: 19.04.08 07:17
Оценка:
Я попробывал использовать malloc но компелятор выдал ошибку:

error C2440: '=' : cannot convert from 'void *' to 'char *'


Вот код:
char * strPath = NULL;
strPath = malloc(strlen(argv[2]));

А когда попробывал второй вариант то получил:

error C2440: '=' : cannot convert from 'std::basic_string<_Elem,_Traits,_Ax>' to 'char *'


Вот код:
char * strPath = NULL;
strPath = std::string(argv[2]);


Что тут можно посоветовать? Как быть?
Заранее спасибо за помощь.
Re[3]: Копирование char* в другой char*.
От: andrey.desman  
Дата: 19.04.08 07:24
Оценка:
Здравствуйте, FelixK, Вы писали:

FK>Я попробывал использовать malloc но компелятор выдал ошибку:


В C++ надо явно приводить тип (я приводил код для C):

FK>Вот код:

FK>
FK>char * strPath = NULL;
FK>strPath = (char *)malloc(strlen(argv[2]));
FK>


FK> А когда попробывал второй вариант то получил:

FK>
FK>error C2440: '=' : cannot convert from 'std::basic_string<_Elem,_Traits,_Ax>' to 'char *'
FK>


FK>Вот код:

//char * strPath = NULL;
std::string strPath = std::string(argv[2]);


FK>Что тут можно посоветовать? Как быть?

Объявить переменную как std::string, а не char *, как я и написал ранее.

FK>Заранее спасибо за помощь.

Пожалуйста.
Re[3]: Копирование char* в другой char*.
От: Sophist Россия http://freelearner-ru.blogspot.com
Дата: 19.04.08 07:28
Оценка:
Здравствуйте, FelixK, Вы писали:

FK>Я попробывал использовать malloc но компелятор выдал ошибку:


FK>
FK>error C2440: '=' : cannot convert from 'void *' to 'char *'
FK>


FK>Вот код:

FK>
FK>char * strPath = NULL;
FK>
FK>


Нужно явно преобразовать тип:

strPath = (char*)malloc(strlen(argv[2]));

FK> А когда попробывал второй вариант то получил:


FK>
FK>error C2440: '=' : cannot convert from 'std::basic_string<_Elem,_Traits,_Ax>' to 'char *'
FK>


FK>Вот код:

FK>
FK>char * strPath = NULL;
FK>strPath = std::string(argv[2]);
FK>


Разумеется, нельзя присвоить массиву char значение типа string. Нужно либо объявить strPath как string, либо воспользоваться методом c_str(), который возвращает как раз указатель на char:

strPath = std::string(argv[2]).c_str();
Мир не просто сложнее, чем мы себе представляем, -- он сложнее, чем мы можем себе представить.
Re[4]: Копирование char* в другой char*.
От: mitchmen  
Дата: 19.04.08 07:47
Оценка:
S>Разумеется, нельзя присвоить массиву char значение типа string. Нужно либо объявить strPath как string, либо воспользоваться методом c_str(), который возвращает как раз указатель на char:

S>strPath = std::string(argv[2]).c_str();


что же вы такое пишете, любезный.
std::string::c_str()
всегда возвращала const char*
Re[4]: Копирование char* в другой char*.
От: FelixK Австралия  
Дата: 19.04.08 08:22
Оценка:
Здравствуйте, andrey.desman, Вы писали:

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


FK>>Я попробывал использовать malloc но компелятор выдал ошибку:


AD>В C++ надо явно приводить тип (я приводил код для C):


FK>>Вот код:

FK>>
FK>>char * strPath = NULL;
FK>>strPath = (char *)malloc(strlen(argv[2]));
FK>>


Огромное спасибо и за подсказки и за то что не побили.
Я уже гора 3 не трогал VC++, всё как-то другими штуками занимался типа SQL, perl и т.д.
Чувствую себя в 1 классе сново.

Ещё раз огромное спасибо за помощь.
Re[5]: Копирование char* в другой char*.
От: Sophist Россия http://freelearner-ru.blogspot.com
Дата: 19.04.08 16:10
Оценка:
Здравствуйте, mitchmen, Вы писали:

M>что же вы такое пишете, любезный.

M>std::string::c_str()
M>всегда возвращала const char*

И то верно . Но, во всяком случае, можно присвоить это выражение константе.
Мир не просто сложнее, чем мы себе представляем, -- он сложнее, чем мы можем себе представить.
Re: Копирование char* в другой char*.
От: Кодт Россия  
Дата: 21.04.08 09:10
Оценка:
Здравствуйте, FelixK, Вы писали:

FK>Подскажите, плиз, как быть. Может кто ссылочку подбросит на примерчик.

FK>И, плиз, не бейте ногами, я давно в VC не писал.

Работа со строками, тем более с голыми строками — это одно из самых тяжёлых для новичка мест.
Поэтому ссылочку можно на разнообразные учебники по С/С++. Это не шутка и не издевательство, а нормальный практический совет.
На примерах же — ты только узнаешь про узкое подмножество граблей и способах их обойти.

Можешь поискать онлайновые C FAQ, C++ FAQ — это тоже пригодится.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[6]: Копирование char* в другой char*.
От: Аноним  
Дата: 21.04.08 14:42
Оценка:
S>И то верно . Но, во всяком случае, можно присвоить это выражение константе.

ну если только при инициализации оной...
но по рукам за такие дела бить надо со всей дури...
Re[2]: Копирование char* в другой char*.
От: don ASKet Россия  
Дата: 21.04.08 14:43
Оценка:
Здравствуйте, Кодт, Вы писали:

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


FK>>Подскажите, плиз, как быть. Может кто ссылочку подбросит на примерчик.

FK>>И, плиз, не бейте ногами, я давно в VC не писал.

К>Работа со строками, тем более с голыми строками — это одно из самых тяжёлых для новичка мест.

К>Поэтому ссылочку можно на разнообразные учебники по С/С++. Это не шутка и не издевательство, а нормальный практический совет.
К>На примерах же — ты только узнаешь про узкое подмножество граблей и способах их обойти.

К>Можешь поискать онлайновые C FAQ, C++ FAQ — это тоже пригодится.


чисто для строк, имхо, вполне подойдет и rsdn-Овская статья: здесь
Автор(ы): Сергей Аристов
Дата: 28.12.2003
Это первая часть, в которой обсуждаются «традиционные» строки в С. В С++ существуют более удобные механизмы для работы со строковыми данными, эти механизмы рассматриваются во второй части статьи. А зачем вообще обсуждать неудобные С-строки, если есть С++? К сожалению, совсем забыть о строках в стиле С нельзя по двум причинам:
1. существует большое библиотек (например, API операционных систем) работающих именно с С-строками
2. строковые классы в С++ все равно основаны на традиционных С-строках, и если мы хотим разобраться в том, как они работают, нам придется понимать их основы.
Меняю два проигрывателя, на один выигрватель! Возможна доплата... ;)
Re[3]: Копирование char* в другой char*.
От: Alexey Frolov Беларусь  
Дата: 21.04.08 15:12
Оценка:
Здравствуйте, FelixK, Вы писали:

FK>Я попробывал использовать malloc но компелятор выдал ошибку:


FK>
FK>error C2440: '=' : cannot convert from 'void *' to 'char *'
FK>


FK>Вот код:

FK>
FK>char * strPath = NULL;
FK>strPath = malloc(strlen(argv[2]));
FK>


вот самый простой вариант
char * strPath = _strdup(argv[2]);


и все же присоединюсь к большинству, используйте С++ и готовые классы, такой код подойдет если только это единственное место в программе, где требуется подобное
Re[2]: Копирование char* в другой char*.
От: FelixK Австралия  
Дата: 21.04.08 22:04
Оценка: -1
Здравствуйте, Кодт, Вы писали:

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


FK>>Подскажите, плиз, как быть. Может кто ссылочку подбросит на примерчик.

FK>>И, плиз, не бейте ногами, я давно в VC не писал.

К>Работа со строками, тем более с голыми строками — это одно из самых тяжёлых для новичка мест.

К>Поэтому ссылочку можно на разнообразные учебники по С/С++. Это не шутка и не издевательство, а нормальный практический совет.
К>На примерах же — ты только узнаешь про узкое подмножество граблей и способах их обойти.

К>Можешь поискать онлайновые C FAQ, C++ FAQ — это тоже пригодится.


Самое страшное для меня во всей этой истории, то что я в 2001 году получил MCSD на базе VC++ 6 (VS 6). Так что я как бе и не новичок, а вот с 2002 года я к С/С++ и не притрагивался, восновном скрипты разные писал. Моя основная работа это тестирование софта.
Но в любом случае я воспользуюсь всеми советами втой или иной мере. Так что всем огромное спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.