Сравнение символов литерала до STD :: string в C ++
-
25-09-2019 - |
Вопрос
Я хотел бы сравнить символ литерала с первым элементом строки, чтобы проверить комментарии в файле. Зачем использовать символ? Я хочу сделать это в функцию, которая принимает символ 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. Ссылка