Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

преобразование char в AnsiString

32K
15 января 2008 года
cclord
5 / / 15.01.2008
Привет всем!
Подскажите пожалуста как можно преобразовать char* в AnsiString или в char?
479
15 января 2008 года
Ухух
142 / / 05.05.2006
AnsiString(имя указателя)
надо почитать начало книги Архангельсского ил просто в справках по Builder про методы AnsiString.
Но это сообщение будет явно удалено ввиду того что не в той ветке.
32K
16 января 2008 года
cclord
5 / / 15.01.2008
Переменная объявлена так
char* lpBuf[7];
AnsiString str1;
При такой строке
str1 = AnsiString(lpBuf); //либо можно еще str1 = AnsiString(*lpBuf);
вылетает ерор. AccesViolation и чет там дальше невразумительное. Ну дело в том что обычный каст в тип как Вы написали не прокатывает. (Книжки читаем). Есть еще советы, пожалуйста?
479
16 января 2008 года
Ухух
142 / / 05.05.2006
[QUOTE=cclord;230068]Переменная объявлена так
char* lpBuf[7];
AnsiString str1;


Только вот так :

char lpBuf[7];

имя массива уже указатель

Вот это вот работает:

char lpbuf[7];
AnsiString str;
sprintf(lpbuf,"qwerty");
str=AnsiString(lpbuf);
12K
16 января 2008 года
MuHAOS
63 / / 06.12.2006
А почему нельзя просто так:

char c[16];

// Чтото делаем

AnsiString s = c;
479
16 января 2008 года
Ухух
142 / / 05.05.2006
Цитата: MuHAOS
А почему нельзя просто так:

char c[16];

// Чтото делаем

AnsiString s = c;



Вот так:
char c[16];
AnsiString s;
//
....
//
s=c;


Но тут у нас перегрузка операции = и неявное преобразование типа char в AnsiString.
Не верьте Страуструпу! Напишите явно что вы хотите сделать - будет шанс получить именно то что хотите.

3
16 января 2008 года
Green
4.8K / / 20.01.2000
Ухух, а ты видишь разницу между:
 
Код:
AnsiString s = c;

и
 
Код:
AnsiString s;
s=c;

Если не видишь, вперед к Страуструпу!
Кстати, а он то чем тебе не угодил?

Где в первом случае ты нашел operation= ? А уж тем более перегрузку..
Где во втором случае ты нашел неявное преобразование?
479
16 января 2008 года
Ухух
142 / / 05.05.2006
Цитата: Green
Ухух, а ты видишь разницу между:
 
Код:
AnsiString s = c;

и
 
Код:
AnsiString s;
s=c;

Если не видишь, вперед к Страуструпу!
Кстати, а он то чем тебе не угодил?

Где в первом случае ты нашел operation= ? А уж тем более перегрузку..
Где во втором случае ты нашел неявное преобразование?



int a;
int b;

a=b;

char a[];
AnsiString b;

a=b;

Одно и то же?
И когда слева у нас строка AnsiString а справа char , то тут нет преобразования? Это хорошо если компилер понимает и скрадывает эти вещи до поры до времени.

AnsiString s - это декларация (возможно с первичной инициализацией)
AnsiString(s) - это метод класса.

276
16 января 2008 года
Rebbit
1.1K / / 01.08.2005
Цитата: Ухух

Это хорошо если компилер понимает и скрадывает эти вещи до поры до времени.



Простите что лезу сюда не грамотный без знания С++ и Страуструпа, но хочется проверить свою мысль. Помоему что компилятор тут вообще ни при чем.
AnsiString s = c;
кажись вызовет конструктор, а
AnsiString s;
s=c;
перегруженую операцию. Или нет ????

240
16 января 2008 года
aks
2.5K / / 14.07.2006
Все верно. В последнем посте Ухух отжег - бегом читать Страуструпа. )
255
16 января 2008 года
Dart Bobr
1.4K / / 09.04.2004
Цитата: Ухух

AnsiString(s) - это метод класса.


А я всю жизнь думал, что это конструктор...

479
16 января 2008 года
Ухух
142 / / 05.05.2006
И конструктор тоже!

Ежели уж копать , то когда написано
AnsiString(const char* ...) - это конструктор
AnsiString(char*...) - метод, но вызывается он не как метод заводимого нами самими класса или скажем

AnsiString str;
str.c_str() - тут никакой операции нет , просто применен метод c_str()

а как функция. Теоретически правильнее было бы писать не AnsiString(str), а может быть str.AnsiString(). Но уже так вот сложилось .

А компилятор делает только то что он понимает надо делать. Чем меньше свободы для понимания мы ему даем, дем больше шансов что и он и мы понимаем одинаково.
240
16 января 2008 года
aks
2.5K / / 14.07.2006
И всетаки Ухух срочно изучать C++!
3
16 января 2008 года
Green
4.8K / / 20.01.2000
Цитата: Ухух

Ежели уж копать , то когда написано
AnsiString(const char* ...) - это конструктор
AnsiString(char*...) - метод, но вызывается он не как метод заводимого нами самими класса или скажем


AnsiString::AnsiString(char*) - т.е. это НЕ конструктор? :)

М-да... ну и кавардак у тебя в голове.
Срочно читать что-нибудь по C++.

Так ты и не ответил, чем различаются записи:

 
Код:
AnsiString s = c;

и
 
Код:
AnsiString s;
s=c;

За тебя это сделал Rebbit. Кстати, он ответил верно.

Цитата: Ухух

int a;
int b;

a=b;

char a[];
AnsiString b;


[color=red]a=b; // Так тебе сделать не дадут[/color]
b=a; // поэтому будет рассматривать так


Одно и то же?


Да, одно и тоже, вызов operator=

Цитата: Ухух

И когда слева у нас строка AnsiString а справа char , то тут нет преобразования?


Если определен AnsiString:: operator=(const char*), а он просто обязан быть определен, то нет тут никакого неявного преобразования.

Цитата: Ухух

Это хорошо если компилер понимает и скрадывает эти вещи до поры до времени.


Компилятор тут не при чем.

Цитата: Ухух

AnsiString s - это декларация (возможно с первичной инициализацией)
AnsiString(s) - это метод класса.


Без комментариев :)

276
16 января 2008 года
Rebbit
1.1K / / 01.08.2005
Цитата: Green
Если определен AnsiString:: operator=(const char*), а он просто обязан быть определен, то нет тут никакого неявного преобразования.


Собственно преобразования кажись быть не может даже если AnsiString::operator= не определен. AnsiString ето же не встроеный тип. Как тут преобразовать если не знаеш что ето.

3
16 января 2008 года
Green
4.8K / / 20.01.2000
Цитата: Rebbit
Собственно преобразования кажись быть не может даже если AnsiString::operator= не определен. AnsiString ето же не встроеный тип. Как тут преобразовать если не знаеш что ето.


Если не определен AnsiString:: operator=(const char*), то может быть вызван конструктор AnsiString::AnsiString(const char*), а потом AnsiString:: operator=(const AnsiString&)
Что можно назвать неявным преобразованием.

255
17 января 2008 года
Dart Bobr
1.4K / / 09.04.2004
Цитата: Ухух
AnsiString(const char* ...) - это конструктор
AnsiString(char*...) - метод, но вызывается он не как метод заводимого нами самими класса


а вы пробовали почитать документация о типе AnsiString? приведу цитату

[QUOTE=Borland Help;] Creates an instance of AnsiString.

__fastcall AnsiString();
__fastcall AnsiString(const char* src);
__fastcall AnsiString(const AnsiString& src);
__fastcall AnsiString(const char* src, unsigned int len);
__fastcall AnsiString(const wchar_t* src);
__fastcall AnsiString(int src);
__fastcall AnsiString(double src);

__fastcall AnsiString(char src);
__fastcall AnsiString(short);
__fastcall AnsiString(unsigned short);
__fastcall AnsiString(unsigned int);
__fastcall AnsiString(long);
__fastcall AnsiString(unsigned long);
__fastcall AnsiString(__int64);
__fastcall AnsiString(unsigned __int64);
__fastcall AnsiString(const WideString &src);

Description

The constructor for AnsiString is overloaded so that you can initialize the value of the string from a variety of types.

When called with no parameters, AnsiString creates an empty string.

Passing a single parameter containing a null-terminated string initializes the value from the supplied string.

Passing another AnsiString (the copy constructor) creates a copy of the supplied AnsiString.

Passing an array of characters and a length creates a string that is a copy of the first len characters of src. For example, if src contains the character string “Hello” and len is 2, then the AnsiString that is created would contain the string “He”.

Passing a single parameter containing a null-terminated wide character string initializes the value from the supplied string.

Passing a numeric value causes the constructor to convert the number to its string representation. Conversions use the general number format with 15 significant digits.[/quote]
из чего делаем вывод что независимо от параметров AnsiString::AnsiString - конструктор, что собственно говоря сказано в любой книге для начинающих по С++

479
17 января 2008 года
Ухух
142 / / 05.05.2006
Отлично! И еще мне просто интересно а про тему поста кто-то помнит? И что то я не помню что на конкретный вопрос кто то что то ответил - так поумничали и все. И кто то не поленился пару строчек проверить работает или нет на самом деле?
255
17 января 2008 года
Dart Bobr
1.4K / / 09.04.2004
Цитата: Ухух
Отлично! И еще мне просто интересно а про тему поста кто-то помнит? И что то я не помню что на конкретный вопрос кто то что то ответил - так поумничали и все. И кто то не поленился пару строчек проверить работает или нет на самом деле?



Да-да, все здесь умничают, а самый большой умник среди нас всех - Страуструп.

А если по теме, то твое решение некачественное, поскольку небезопасное. Рассмотрим твой код поподробней.

 
Код:
char lpbuf[7];
AnsiString str;
sprintf(lpbuf,"qwerty");
str=AnsiString(lpbuf);


А теперь представим, что произойдет, если ты попытаешься запихнуть в lpbuf не строку "qwerty", а скажем строку "I like programming on с++"? Как ты думаешь что произойдет? Если уже делать таким методом то так:

 
Код:
const char lpbuf[7] = "qwerty" ;
AnsiString str;
str=AnsiString(lpbuf);


К тому же приведеный тобой код конвертит из типа char[] в AnsiString.
А автор спрашивал из char* в AnsiString ИЛИ char.

Следодвательно код будет в первом случае примерно таким(если так хочется использовать конструктор AnsiString):

 
Код:
char * lpbuf = new char[strlen("qwerty")+1];
strcpy(lpbuf, "qwerty"));
AnsiString str = AnsiString(lpbuf);


Из char* в char преобразовывать нельзя. Так как char* - указатель набуфер произвольной длины елементов типа char. Из char * мона преобразоватьразве что только в char[]:
 
Код:
#define MAX_BUF_SIZE 255
char * lpbuf = new char[strlen("qwerty")+1];
strcpy(lpbuf, "qwerty"));
int length = strlen(lpbuf);
char anotherbuf[MAX_BUF_SIZE];
if (length <= MAX_BUF_SIZE)
     strcpy(anotherbuf,lpbuf, strlen("qwerty"));
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог