Вопрос

Я хотел бы сравнить символ литерала с первым элементом строки, чтобы проверить комментарии в файле. Зачем использовать символ? Я хочу сделать это в функцию, которая принимает символ VAR для комментариев. Я не хочу разрешать строку, потому что я хочу ограничить его одному символу в длину.

Имея в виду, я предположил, что простой способ пойти, чтобы обратиться к персонажу и передавать его на функцию сравнения STD :: String. Однако это дает мне непреднамеренные результаты.

Мой код выглядит следующим образом:

#include <string>
#include <iostream>

int main ( int argc, char *argv[] )
{
  std::string my_string = "bob";
  char my_char1 = 'a';
  char my_char2 = 'b';

  std::cout << "STRING : " << my_string.substr(0,1) << std::endl
        << "CHAR : " << my_char1 << std::endl;
  if (my_string.substr(0,1).compare(&my_char1)==0)
    std::cout << "WOW!" << std::endl;
  else
    std::cout << "NOPE..." << std::endl;

  std::cout << "STRING : " << my_string.substr(0,1) << std::endl
        << "CHAR : " << my_char2 << std::endl;
  if (my_string.substr(0,1).compare(&my_char2)==0)
    std::cout << "WOW!" << std::endl;
  else
    std::cout << "NOPE..." << std::endl;

  std::cout << "STRING : " << my_string << std::endl
        << "STRING 2 : " << "bob" << std::endl;
  if (my_string.compare("bob")==0)
    std::cout << "WOW!" << std::endl;
  else
    std::cout << "NOPE..." << std::endl;
}

Дает мне...

STRING : b
CHAR : a
NOPE...
STRING : b
CHAR : b
NOPE...
STRING : bob
STRING 2 : bob
WOW!

Почему функция считает, что подкрандка и символ не одинаковы. Какой самый короткий способ правильно сравнивать Chars и STD :: String vars?

(короткий разговор избегать реклассификации Из моего вопроса .... Не стесняйтесь пропустить)
Когда я говорю, что короткое, я имею в виду, что из желания кодирования красноречия. Обратите внимание, что это не вопрос домашнего задания. Я кандидат Химико-инженерных наук, кандидат в качестве части независимых исследований. Один из моих последних вопросов был реклассифицирован как «домашнее задание» пользователем местный (Кто также сделал замечание Snide), когда я спросил о эффективности, которую я рассмотрел на границе злоупотребления. Мой код может или не может быть повторно использован другими, но я пытаюсь сделать его легко читать и поддерживаться. У меня также есть странное желание сделать мой код максимально эффективным, где это возможно. Следовательно, вопросы по эффективности и красноречивому.

Это было полезно?

Решение

Делая это:

  if (my_string.substr(0,1).compare(&my_char2)==0)

Не будет работать, потому что вы «обманывая» нить, думая, что это получает указатель на расторгнутую NULL C-String. Это будет иметь странные эффекты до и в том числе сбой вашей программы. Вместо этого просто используйте нормальное равенство, чтобы сравнить первый символ строки с помощью my_char:

 if (my_string[0] == my_char)
   // do stuff

Другие советы

Почему бы не просто использовать оператор индексации на вашей строке? Это вернет тип CHAR.

if (my_string[0] == my_char1)

Вы можете использовать оператор [] строки, чтобы сравнить его с одним символом

// string::operator[]
#include <iostream>
#include <string>
using namespace std;

int main ()
{
    string str ("Test string");
    int i; char c = 't';
    for (i=0; i < str.length(); i++)
    {
        if (c == str[i]) {
            std::cout << "Equal at position i = " << i << std::endl;
        }
    }
    return 0;
}

Поведение первых двух вызовов для сравнения полностью зависит от того, какого случайного содержимого памяти следует адрес каждого символа. Вы звоните basic_string::compare(const char*) А здесь предполагается, что параметр должен быть C-String (NULL-SCRANCED), а не один символ. Вызов Sefe () сравнит ваш желаемый CHAR, а затем все в памяти после этого CHAN до следующего байта 0x00, с Std :: String в руке.

OTOH Оператор << имеет правильную перегрузку для ввода CHAR, поэтому ваш выход не отражает то, что вы на самом деле сравниваете здесь.

Преобразовать DECALS и B, чтобы быть const char[] a = "a"; И вы получите то, что вы хотите произойти.

Довольно стандартные строки в C ++ расторгнуты NULL; персонажи нет. Поэтому, используя стандартный метод сравнения, вы действительно проверяете, если «B 0» == 'B'.

Я использовал это и получил желаемый выход:

if (my_string.substr(0,1).compare( 0, 1, &my_char2, 1)==0 )
    std::cout << "WOW!" << std::endl;
else
    std::cout << "NOPE..." << std::endl;

Что это говорит, запускается в положении 0 подстроки, используйте длину 1 и сравните его с моим ссылкой на характер длиной 1. Ссылка

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top