Сравните байт строки с символом c ++ - PullRequest
0 голосов
/ 24 сентября 2018

Мне нужно перебрать строку и сравнить каждый символ в этой строке с определенным символом, например, «M».std::string::find не будет работать для меня, поскольку порядок, в котором символы появляются в строке, имеет значение (например, римскими цифрами MC отличается от CM).

Код, который я получил (я компилируюс c ++ 11):

#include <iostream>
#include <cstring>
using namespace std;


int main ()
{
  string str = ("Test Mstring");
  for (auto it = str.begin(); it < str.end(); it++) {
    if (strcmp(*it, "M") == 0) cout << "M!1!!1!" << endl;
  }
}

Отображение ошибки консоли:

test.cc: In function ‘int main()’:
test.cc:10:16: error: invalid conversion from ‘char’ to ‘const char*’ [-fpermissive]
     if (strcmp(*it, "M") == 0) cout << "M!1!!1!" << endl;
                ^~~
In file included from /usr/include/c++/7/cstring:42:0,
                 from test.cc:2:
/usr/include/string.h:136:12: note:   initializing argument 1 of ‘int strcmp(const char*, const char*)’
 extern int strcmp (const char *__s1, const char *__s2)

Ответы [ 4 ]

0 голосов
/ 24 сентября 2018

Вы можете сделать что-то вроде следующего:

std::for_each(str.begin(), str.end(), [](char &c){ if(c == 'M') cout<< "M!1!!1!"<<endl; });

Итератор указывает на символ в строковой переменной, и вам не нужно сравнивать строки

0 голосов
/ 24 сентября 2018

Элементами строки являются символы, такие как 'M', а не строки.

string str = "Test Mstring";
for (auto it = str.begin(); it < str.end(); it++) {
    if (*it == 'M') cout << "M!1!!1!" << endl;
}

или

string str = "Test Mstring";
for (auto ch: str) {
    if (ch == 'M') cout << "M!1!!1!" << endl;
}
0 голосов
/ 24 сентября 2018

strcmp сравнивает целые строки, поэтому, если вы сравните "mex" с "m", они не равны, и вы не сможете сравнить char с char с string в этой функции, потому что для сравненияchars, вы можете использовать строку в качестве массива, например,

string c = "asd";
string d = "dss";
if(c[0]==d[0] /* ... */
if(c[0]=='a') /*... */

Помните, что it является указателем на символ в строке, поэтому при разыменовании вы должны сравнивать с символом

if(*it=='c') 

Кстати, почему вы смешиваете строки C и C ++?Вы используете string как в C ++, но функция strcmp происходит из библиотеки C

0 голосов
/ 24 сентября 2018

Разыменование итератора, полученного из std::string, возвращает char.Ваш код просто должен быть:

if (*it == 'M') cout << "M!1!!1!" << endl;

Также:

  • Обратите внимание на 'M'! = "M".В C ++ двойные кавычки определяют строковый литерал, который заканчивается нулевым байтом, тогда как одинарные кавычки определяют один символ.

  • Не используйте endl, если вы не собираетесь сбрасыватьстандартный буфер.\n намного быстрее.

  • strcmp в C ++ обычно является запахом кода.

...