Как сравнивать строки

#c #string #compare

Вопрос:

Я хотел сравнить строку, фактически не определяя одну из них как строку, что-то вроде этого,

 if (string == "add")
 

Должен ли я объявлять "add" как строку или можно сравнить аналогичным образом?

Комментарии:

1. Что это за тип string ? Это std::string объект C или просто a const char* ?

2. @e.Джеймс Оунсер хорош. Также стоит отметить, что литерал строки или последовательности символов должен быть заключен в " (двойные кавычки), одинарные кавычки предназначены для литералов с одним символом.

Ответ №1:

В C std::string класс реализует операторы сравнения, поэтому вы можете выполнить сравнение, используя == именно то, что вы ожидали:

 if (string == "add") { ... }
 

При правильном использовании перегрузка операторов является отличной функцией C .

Комментарии:

1. Что ж, теперь я действительно в замешательстве. Если string есть std::string объект, это сработает, но тогда strcmp() бы не сработало. Что это такое? Я умираю от желания знать! :)

2. Но следует отметить, что сравнение даст другой результат, если «строка» есть char* !

3. e.Джеймс: если «строка» — это std::строка, то if( strcmp(string.c_str(),"add")==0 ) {...} это сработает.

4. @frunsi: Да, но в этом действительно не было бы необходимости. Я имел в виду комментарий Анона в ответе Кристофера Армстронга (где он говорит, что if (strcmp(string, "add") == 0) { ... } это сработало.

5.@frunsi: Я беспокоюсь , что string это char* , в таком случае, это неправильный ответ. Я надеялся, что Анон прояснит это.

Ответ №2:

Вам нужно использовать strcmp .

 if (strcmp(string,"add") == 0){
    print("success!");
}
 

Комментарии:

1. Примечание: strcmp() это функция C, которая принимает указатели в const char* качестве своих аргументов. Это работает в данном случае , потому std::string что объект преобразуется обратно в a const char* , но это не лучший способ сделать что-то в C

2. @e.Джеймс: Нет, std::string неявно преобразуется в const char* , s.c_str() для этого вам нужно позвонить. Но, согласно вопросу «без определения любого из них как строки», string это не std::string для начала.

3. @Бен Фойгт: Ах, да, вы правы насчет обратного преобразования. Моя ошибка.

4. В коде C вы должны предпочесть strncmp() вместо strcmp(), что является более безопасным решением.

Ответ №3:

Вы могли бы использовать strcmp() :

 /* strcmp example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char szKey[] = "apple";
  char szInput[80];
  do {
     printf ("Guess my favourite fruit? ");
     gets (szInput);
  } while (strcmp (szKey,szInput) != 0);
  puts ("Correct answer!");
  return 0;
}
 

Комментарии:

1. Это будет работать (потому что C обратно совместим с C), но это не лучший способ делать что-то на C

2. Это также связано с проблемой переполнения буфера, проверка длины на szInput отсутствует

Ответ №4:

Мы используем следующий набор инструкций на компьютерном языке C .

Цель: проверьте, равно ли значение внутри std::string контейнера «добавить»:

 if (sString.compare(“add”) == 0) { //if equal
    // Execute
}