преобразование char в AnsiString
Подскажите пожалуста как можно преобразовать char* в AnsiString или в char?
надо почитать начало книги Архангельсского ил просто в справках по Builder про методы AnsiString.
Но это сообщение будет явно удалено ввиду того что не в той ветке.
char* lpBuf[7];
AnsiString str1;
При такой строке
str1 = AnsiString(lpBuf); //либо можно еще str1 = AnsiString(*lpBuf);
вылетает ерор. AccesViolation и чет там дальше невразумительное. Ну дело в том что обычный каст в тип как Вы написали не прокатывает. (Книжки читаем). Есть еще советы, пожалуйста?
char* lpBuf[7];
AnsiString str1;
Только вот так :
char lpBuf[7];
имя массива уже указатель
Вот это вот работает:
char lpbuf[7];
AnsiString str;
sprintf(lpbuf,"qwerty");
str=AnsiString(lpbuf);
char c[16];
// Чтото делаем
AnsiString s = c;
char c[16];
// Чтото делаем
AnsiString s = c;
Вот так:
char c[16];
AnsiString s;
//
....
//
s=c;
Но тут у нас перегрузка операции = и неявное преобразование типа char в AnsiString.
Не верьте Страуструпу! Напишите явно что вы хотите сделать - будет шанс получить именно то что хотите.
и
s=c;
Если не видишь, вперед к Страуструпу!
Кстати, а он то чем тебе не угодил?
Где в первом случае ты нашел operation= ? А уж тем более перегрузку..
Где во втором случае ты нашел неявное преобразование?
и
s=c;
Если не видишь, вперед к Страуструпу!
Кстати, а он то чем тебе не угодил?
Где в первом случае ты нашел operation= ? А уж тем более перегрузку..
Где во втором случае ты нашел неявное преобразование?
int a;
int b;
a=b;
char a[];
AnsiString b;
a=b;
Одно и то же?
И когда слева у нас строка AnsiString а справа char , то тут нет преобразования? Это хорошо если компилер понимает и скрадывает эти вещи до поры до времени.
AnsiString s - это декларация (возможно с первичной инициализацией)
AnsiString(s) - это метод класса.
Это хорошо если компилер понимает и скрадывает эти вещи до поры до времени.
Простите что лезу сюда не грамотный без знания С++ и Страуструпа, но хочется проверить свою мысль. Помоему что компилятор тут вообще ни при чем.
AnsiString s = c;
кажись вызовет конструктор, а
AnsiString s;
s=c;
перегруженую операцию. Или нет ????
AnsiString(s) - это метод класса.
А я всю жизнь думал, что это конструктор...
Ежели уж копать , то когда написано
AnsiString(const char* ...) - это конструктор
AnsiString(char*...) - метод, но вызывается он не как метод заводимого нами самими класса или скажем
AnsiString str;
str.c_str() - тут никакой операции нет , просто применен метод c_str()
а как функция. Теоретически правильнее было бы писать не AnsiString(str), а может быть str.AnsiString(). Но уже так вот сложилось .
А компилятор делает только то что он понимает надо делать. Чем меньше свободы для понимания мы ему даем, дем больше шансов что и он и мы понимаем одинаково.
Ежели уж копать , то когда написано
AnsiString(const char* ...) - это конструктор
AnsiString(char*...) - метод, но вызывается он не как метод заводимого нами самими класса или скажем
AnsiString::AnsiString(char*) - т.е. это НЕ конструктор? :)
М-да... ну и кавардак у тебя в голове.
Срочно читать что-нибудь по C++.
Так ты и не ответил, чем различаются записи:
и
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) - это метод класса.
Без комментариев :)
Собственно преобразования кажись быть не может даже если AnsiString::operator= не определен. AnsiString ето же не встроеный тип. Как тут преобразовать если не знаеш что ето.
Если не определен AnsiString:: operator=(const char*), то может быть вызван конструктор AnsiString::AnsiString(const char*), а потом AnsiString:: operator=(const AnsiString&)
Что можно назвать неявным преобразованием.
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 - конструктор, что собственно говоря сказано в любой книге для начинающих по С++
Да-да, все здесь умничают, а самый большой умник среди нас всех - Страуструп.
А если по теме, то твое решение некачественное, поскольку небезопасное. Рассмотрим твой код поподробней.
AnsiString str;
sprintf(lpbuf,"qwerty");
str=AnsiString(lpbuf);
А теперь представим, что произойдет, если ты попытаешься запихнуть в lpbuf не строку "qwerty", а скажем строку "I like programming on с++"? Как ты думаешь что произойдет? Если уже делать таким методом то так:
AnsiString str;
str=AnsiString(lpbuf);
К тому же приведеный тобой код конвертит из типа char[] в AnsiString.
А автор спрашивал из char* в AnsiString ИЛИ char.
Следодвательно код будет в первом случае примерно таким(если так хочется использовать конструктор AnsiString):
strcpy(lpbuf, "qwerty"));
AnsiString str = AnsiString(lpbuf);
Из char* в char преобразовывать нельзя. Так как char* - указатель набуфер произвольной длины елементов типа char. Из char * мона преобразоватьразве что только в char[]:
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"));