Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Пустая строка, определение 
V
    Опции темы
lv151
Дата 13.4.2009, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 916
Регистрация: 11.2.2008

Репутация: нет
Всего: 2



Как правильно определять, что строка пустая - (str == "") или (GetLength() == 0) ?
PM MAIL   Вверх
Andrey44
Дата 13.4.2009, 11:51 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 2
Всего: 26



lv151, а str это что?


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
azesmcar
Дата 13.4.2009, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Код

if ( str.empty() )


Добавлено через 1 минуту и 29 секунд
lv151

если речь идет об std::string
PM   Вверх
lv151
Дата 13.4.2009, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 916
Регистрация: 11.2.2008

Репутация: нет
Всего: 2



CString
IsEmpty() - тоже есть. smile

Это сообщение отредактировал(а) lv151 - 13.4.2009, 12:07
PM MAIL   Вверх
andrew_121
Дата 13.4.2009, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



lv151, Пометь решенным!


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
inside_pointer
Дата 14.4.2009, 23:41 (ссылка)  | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 9.3.2008

Репутация: 5
Всего: 12



Код

*str == '\0';

PM MAIL   Вверх
azesmcar
Дата 15.4.2009, 08:38 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



inside_pointer

лишь бы что нибудь написать? вы предыдущие посты прочли? это CString, класс МФЦ, причем вопрос давно решен
PM   Вверх
inside_pointer
Дата 15.4.2009, 10:08 (ссылка)   | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 9.3.2008

Репутация: 5
Всего: 12



azesmcar, а что неправильного ? у неё указателя нет, или он указывает не на первый символ ?

Это сообщение отредактировал(а) inside_pointer - 15.4.2009, 10:55
PM MAIL   Вверх
azesmcar
Дата 15.4.2009, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



*str - это ведь не внутренний указатель. Это char* (по всей видимости). И даже если есть, почему правильнее проверять внутренний указатель чем собственно функцией empty, которая кстати говоря с большой долей вероятности инлайн и существует как раз для этой проверки. 
PM   Вверх
mes
Дата 15.4.2009, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(inside_pointer @  15.4.2009,  09:08 Найти цитируемый пост)
azesmcar, а что неправильного ? у ней указателя нет, или он указывает не на первый символ ?

одно то что первый символ находится по индексу 1, а не 0 уже должен предостеречь о таких действий.
а вобще надо стараться не использовать знания о внутренней структуре объекта, и использовать методы предоставляеммые классом.  smile 


--------------------
PM MAIL WWW   Вверх
zim22
Дата 15.4.2009, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(inside_pointer @  15.4.2009,  10:08 Найти цитируемый пост)
 а что неправильного ? у ней указателя нет, или он указывает не на первый символ ?

c std::string такое не прокатит.
Код

std::string *str = new std::string;
if (*str == '\0') // error compile time



--------------------
PM MAIL   Вверх
mes
Дата 15.4.2009, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(zim22 @  15.4.2009,  09:26 Найти цитируемый пост)
c std::string такое не прокатит.

 smile ,только пример не верный, или двойное разъименование используйте, или стринг создавайте не в куче, а то вводите в заблуждение  smile 


--------------------
PM MAIL WWW   Вверх
zim22
Дата 15.4.2009, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



не работает. т.к. operator== string'a не предназначен для сравнения с char
Цитата(mes @  15.4.2009,  10:41 Найти цитируемый пост)
 или двойное разъименование используйте

Код

std::string *str = new std::string;
  **str == '\0';


Цитата(mes @  15.4.2009,  10:41 Найти цитируемый пост)
 или стринг создавайте не в куче,

Код

  std::string str2;
  *str2 == '0';




--------------------
PM MAIL   Вверх
inside_pointer
Дата 15.4.2009, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 9.3.2008

Репутация: 5
Всего: 12



Код

           struct string {
               char* p;
               int size;   // размер вектора, на который указывает p

               string(int size) { p = new char[size=sz]; }
               ~string() { delete p; }
               string& operator=(const string&);
           };


у Страуструпа в электронной книжке нашёл такое описание, тогда конечно не прокатит, так как указатель у такой строки будет на структуру и, если даже всё таки он первый символ строки выдаст, это будет сопадением (ну типа char *p идёт первым в структуре)
хотя, нашёл ещё такое: если указатель на структуру приводится к типу указателя на её первый элемент, результат указывает на её первый элемент
PM MAIL   Вверх
mes
Дата 15.4.2009, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(zim22 @  15.4.2009,  10:07 Найти цитируемый пост)
не работает. т.к. operator== string'a не предназначен для сравнения с char

естественно и логично, также как и для сравнения char* и char.

но это совсем не то, о чем вел речь inside_pointer.
Он предлогал использовать разъименование, и не работать будет по причине отсутвия у std::string operatora * (Про АнсиСтринг сказать не могу.)
Код

std::string s;
*s; // ошибка компиляции и не важно стоит дальше == или что то другое.


Добавлено через 3 минуты и 35 секунд
Цитата(inside_pointer @  15.4.2009,  10:11 Найти цитируемый пост)
хотя, нашёл ещё такое: если указатель на структуру приводится к типу указателя на её первый элемент, результат указывает на её первый элемент 

1. И где здесь приведение к типу указателя на его первый элемент ?
Цитата(inside_pointer @  14.4.2009,  22:41 Найти цитируемый пост)
*str == '\0';

2. и с какой стати нужное Вам, должно оказаться первым элементом ?!



--------------------
PM MAIL WWW   Вверх
inside_pointer
Дата 15.4.2009, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 9.3.2008

Репутация: 5
Всего: 12



всё

Код

 
#include <iostream>

using namespace std;

// проверяет строку на пустоту
int main(void)
{
    string s1 = "one two",
           s2 = "";
    
    cout << *(char **) &s1 << endl;
    if (**(char **) &s2 == '\0')
        cout << "It's empty :)" << endl;
    return 0;
}


Код

[guest@station tmp]$ ./test
one two
It's empty :)
[guest@station tmp]$

PM MAIL   Вверх
azesmcar
Дата 15.4.2009, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



inside_pointer, 
вылетает при запуске на визуал студии

Добавлено через 5 минут и 55 секунд
inside_pointer
в GCC std::string хранит только указатель на char, потому там сработает..только вот стандарт этого не гарантирует.
Код

if (**(char **) &s2 == '\0')

по вашему это красивее и правильнее чем
Код

if ( str.empty() )

?
PM   Вверх
mes
Дата 15.4.2009, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(inside_pointer @  15.4.2009,  10:31 Найти цитируемый пост)
*(char **)&

этим Вы никого кроме себя не обманули. 



--------------------
PM MAIL WWW   Вверх
inside_pointer
Дата 15.4.2009, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 9.3.2008

Репутация: 5
Всего: 12



Цитата(azesmcar)

только вот стандарт этого не гарантирует

ну я там писал, что если совпадёт, то можно
а если не совпадёт, то тоже можно smile

Добавлено @ 12:03
mes, ну, это прямой доступ к указателю на первый символ, а не посредством компилятора (типа, как он там решит)

Это сообщение отредактировал(а) inside_pointer - 15.4.2009, 12:07
PM MAIL   Вверх
mes
Дата 15.4.2009, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(inside_pointer @  15.4.2009,  11:02 Найти цитируемый пост)
ну я там писал, что если сопадёт, то можно
а если не сопадёт, то тоже можно 

да.. конечно можно создавать себе проблемы на ровном месте.. имхо, это запретить не реально.
только нас не надо убеждать следовать Вашим путем  smile 


--------------------
PM MAIL WWW   Вверх
inside_pointer
Дата 15.4.2009, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 9.3.2008

Репутация: 5
Всего: 12



ну, empty тоже запоминать тогда надо, в итоге разрастётся всё это как Visual Basic - триста операторов, все по-мелочи
PM MAIL   Вверх
mes
Дата 15.4.2009, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(inside_pointer @  15.4.2009,  11:02 Найти цитируемый пост)
mes, ну это прямой доступ к указателю на первый символ, а не посредством компилятора (типа как он там решит) 

а если допустить, что класс может быть описан примерно так  
Код

class string
{
   int size;
   char m_bufin[20]; // внутренний буффер для коротких строк
   char *m_bufex ; // указатель на внешний буффер, если строка превышает допустимый минимум.
..
}

?
не говоря уже о строках с COW..там буффер получается "запрятан еще дальше". А также совсем не обязательно чтоб буффер был представлен как char *.

Добавлено @ 12:16
Цитата(inside_pointer @  15.4.2009,  11:10 Найти цитируемый пост)
ну, empty тоже запоминать тогда надо 

если память плохая, можно заглянуть в документацию.  smile

Добавлено через 3 минуты и 28 секунд
Цитата(inside_pointer @  15.4.2009,  11:10 Найти цитируемый пост)
тоже запоминать тогда надо, в итоге разрастётся всё это как Visual Basic - триста операторов, все по-мелочи 

от запомнить ничего не разростется.  smile

Добавлено через 5 минут и 42 секунды
Цитата(inside_pointer @  15.4.2009,  11:02 Найти цитируемый пост)
а не посредством компилятора (типа, как он там решит)

вобще-то  доступ через интерфейс, определяет не компилятор, а программист/ы, написавший этот компонент.
а компилятор лишь следит (в силу своих возможностей) за установленными договоренностями .


Это сообщение отредактировал(а) mes - 15.4.2009, 12:16


--------------------
PM MAIL WWW   Вверх
inside_pointer
Дата 15.4.2009, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 9.3.2008

Репутация: 5
Всего: 12



Цитата(mes)

определяет не компилятор, а программист/ы, написавший этот компонент

какой компонент, компонент компилятора ?

Цитата(mes)

А также совсем не обязательно чтоб буффер был представлен как char *

это как, а в чём смысл иного представления ? char - минимальный размер, чем меньше размер, тем меньше требований к выравниванию
PM MAIL   Вверх
mes
Дата 15.4.2009, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(inside_pointer @  15.4.2009,  11:36 Найти цитируемый пост)

какой компонент, компонент компилятора ?

класс, функция или библиотека. В нашем случае класс string.

вот почуствуйте разницу между возможной реализцией внутренней функции и того что Вы предлагали :
Код

class string
{
    char * m_buf;
 public:
      string () : m_buf(NULL) {}
      bool is_empty () { return !m_buf || !*m_buf; } 
};

// if (**(char **) &s == '\0')

как видете, Ваш способ имеет вероятность обращения по нулевому указателю.


Цитата(inside_pointer @  15.4.2009,  11:36 Найти цитируемый пост)
это как, а в чём смысл иного представления ? 

а может она хранит внутри себя как юникод ? 

Это сообщение отредактировал(а) mes - 15.4.2009, 12:49


--------------------
PM MAIL WWW   Вверх
azesmcar
Дата 15.4.2009, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата

ну, empty тоже запоминать тогда надо, в итоге разрастётся всё это как Visual Basic - триста операторов, все по-мелочи 


Почитайте главу "Ослабленная монолитность std::string" в книге Саттера "Решение более сложных задач на С++".
Там он говорит о том что многие функции класса std::string могли бы быть глобальными, например тот же empty
Код

namespace std {
   template <typename T>
   bool empty( const T& container ) {
      return (container.begin() == container.end());
   }
}

это можно применять с любым STL совместимым контейнером. И это приемлемый способ (и даже лучше чем тот что есть сейчас)..но ваш я приемлемым никак не могу назвать

Это сообщение отредактировал(а) azesmcar - 15.4.2009, 12:55
PM   Вверх
mes
Дата 15.4.2009, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(azesmcar @  15.4.2009,  11:54 Найти цитируемый пост)
И это приемлемый способ

но это тоже не избавит от запоминания функции empty  smile 


--------------------
PM MAIL WWW   Вверх
azesmcar
Дата 15.4.2009, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Склероз лечится smile 


Это сообщение отредактировал(а) azesmcar - 15.4.2009, 13:21
PM   Вверх
zim22
Дата 15.4.2009, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(azesmcar @  15.4.2009,  12:54 Найти цитируемый пост)
это можно применять с любым STL совместимым контейнером.

это можно применять с чем угодно. и если передадим не контейнер, то получим шквал ругательств от компилятора.
Код

char *s = "";
empty(s);

а вообще да, способ хороший. мне нравится smile


--------------------
PM MAIL   Вверх
azesmcar
Дата 15.4.2009, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата

это можно применять с чем угодно. и если передадим не контейнер, то получим шквал ругательств от компилятора.

под словом применение я понимаю "использовать так чтобы работало" smile 
PM   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0759 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.