C ++ сравнение строк и символов - PullRequest
1 голос
/ 04 июля 2011

у меня есть строка "8120, 8120NGE, 8120NG, 8130, 8130NG, 8130NGE".

И у меня есть char* (0x0012d094 "8130")

Я хочу посмотреть, есть ли "8130". Это точное слово.

Так что я использую

  istringstream iss(boards);
  string token;
  AVBOOL foundBool=FALSE;
  while(std::getline(iss, token, ','))
  {
    const char * compareToken = token.c_str();  
    token.compare(board);     // with that : it doesn't work cause "8130" is not    equal   0x0012d094 "8130"
    if(strcmp(compareToken,board)==0) //with that it doesnt work cause 0x0012cef0 " 8130" is not equal 0x0012d094 "8130"
      {
        foundBool=TRUE;
      }
  }

Итак, вопрос в том, как сравнить строку с символом *.

Нужно ли преобразовывать символ в строку, а затем использовать string.compare ИЛИ ЖЕ Нужно ли конвертировать строку в символ и использовать strcmp? ИЛИ ЖЕ Мне нужно сделать что-то еще?

Я как бы потерялся здесь.

Ответы [ 6 ]

2 голосов
/ 04 июля 2011

Вы можете использовать оба.

Я предпочитаю использовать метод .c_str () с функцией strcmp () C, поскольку он не создает строковый объект.

1 голос
/ 04 июля 2011

Чтобы удалить пробелы из строки, смотрите « Удаление пробелов из std :: string в C ++ ».И тогда вы можете сравнить строки в вашем коде.

0 голосов
/ 04 июля 2011

Я думаю, вам нужно переписать свой код, чтобы он удалял пробелы перед чтением токенов. Вы можете настроить свой цикл так:

istringstream iss(boards);
string token;
bool found = false;
while((iss >> std::ws) && std::getline(iss,token,','))
{
    found |= (token == board);
}

Цикл также можно оптимизировать для остановки при обнаружении токена:

while(!found && (iss >> std::ws) && std::getline(iss,token,','))
{
    found = (token == board);
}
0 голосов
/ 04 июля 2011

Ваш вопрос звучит так, как будто вы запутались в сравнении - вы можете сравнить string и const char* просто отлично! И string::compare(const char*), и strcmp вернут 0, если содержащиеся символы равны:

string one = "pl";
string two = "ex";
const char* too = "plex";

int main()
{
        string three = one + two;
        cout << three.compare(too) << endl;
        cout << strcmp(three.c_str(), too) << endl;
}

напечатает

0
0

Ваша настоящая проблема с приложением состоит в том, что вы, вероятно, хотите разделить строку на ", ", чего вы не можете сделать с помощью стандартных библиотечных инструментов. Если вы не можете вообще избавиться от пробелов, как указано в ответе Мазурова, вам понадобится токенизатор, который принимает разделители строк.

0 голосов
/ 04 июля 2011

Подойдет ли std::set для ваших нужд?

std::set<std::string> boards;
while (std::getline(iss, token, ',')) {
    boards.insert(token);
}
if (boards.find(board) != boards.end()) {
    // we found it
}

Обратите внимание, что это не учитывает пробелы, которые могут быть в токенах.

0 голосов
/ 04 июля 2011

как насчет boards.find( token )

, если вам нужно, чтобы после него не было буквенно-цифровых символов, просто проверьте, есть ли такое

и, если это так, выполните поиск снова с этой позиции

ура & hth.,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...