2009-11-24 1 views
0

В моем классе программирования у нас в настоящее время есть проект, который требует от нас принятия аргументов в программу. Затем мне нужно проверить один из аргументов, чтобы узнать, какое значение было передано программе, чтобы я мог выбрать подходящее поведение для программы. В предыдущем домашнем задании я сделал это с помощью функции STRCMP включены в библиотеке CString, используя следующий код:Сравнение массивов символов и строковых литералов в C++ без cstring

int main(int argc, char *argv[]) { 
    if (strcmp(argv[1], "yes") == 0) { 
     // do this code 
    } else if (strcmp(argv[1], "no") == 0) { 
     // do this code 
    } 
} 

Однако, по какой-то причине мы не разрешается использовать библиотеку CString в этом проекте. Как еще я могу это сделать?

+1

Для 2-3 символов вы можете даже попробовать, если (str [0] == 'n' && str [1] == 'o'). (возможно, && str [2] == '\ 0') –

+4

Цель задания, похоже, научит вас писать 'strcmp'. YMMV! – dirkgently

+1

Нет, мы на самом деле пишем реализацию блэкджека. Это всего лишь небольшая проблема, с которой я столкнулся, что не был уверен, как справиться. – blcArmadillo

ответ

5

Попробуйте это:

if (argv[1] == std::string("yes")) { stuff }

Если цель упражнения, чтобы научить, как работать сравнения строк, а затем реализовать цикл, как и другие ответы предполагают. Тем не менее, в C++ вы не должны использовать strcmp - для причины существует класс строк.

+0

Если он не может использовать 'cstring', я сомневаюсь, что он может использовать класс' std :: string' –

+2

Ну, это зависит от курса. Я знаю курсы C++, где использование функций C запрещается заставлять людей изучать возможности C++, обеспечивающие такую ​​же функциональность. Я отредактировал свой ответ, чтобы лучше отразить это. – hrnt

+0

Я вижу; хороший звонок. –

1

Вы всегда можете сравнить строки, используя руководство для цикла, сравнивая его по характеру. Ваше условие завершения будет состоять в том, когда вы столкнулись с NULL-char (поскольку в строках C заканчиваются с нулевой отметкой) или когда вы сталкиваетесь с символом в первой строке, которая не равна его аналогу во второй строке.

const char* s1 = "abcdefg"; 
const char* s2 = "abcdefg"; 

const char* p1 = s1; 
const char* p2 = s2; 

int same = 0; 
for (; (same = (*p1 == *p2)) && *p1 != '\0'; ++p1, ++p2); 

if (same) printf("The strings are equal\n"); 
else printf("The strings are NOT equal\n"); 

Это даст вам сравнение по характеру. Но обратите внимание, что это отличается от strcmp в том смысле, что strcmp делает лексикографическое сравнение, которое также скажет вам, если одна строка «меньше», чем другая строка с точки зрения алфавитного порядка. Но, похоже, вам нужно только сравнение равенства, которое только скажет вам, совпадают ли строки.

+0

Не будет ли это сбой для s1 = "a" и s2 = "abcdefg"? То есть, не сказал бы, что строки равны? – ChrisInEdmonton

+0

Хорошая точка, проверка на nullchar должна произойти после сравнения. Я исправлю код выше. –

1

написать собственную функция зЬгстра

+1

ДА! - но назовите это чем-то другим, чтобы ваша TA не маркировала вас, потому что они видели 'strcmp()' в вашем решении. –

2

Сделать свою собственную my_string_comp функцию:

// return 0 on success, -1 on failure 
int my_string_comp(char* a, char *b) { 
    if(a && b) { // check for non null pointers 
    while(*a != '\0' && *b != '\0' && *a == *b) { a++; b++; } 
    if(*a == '\0' && *b == '\0') { return 0; } 
    } 
    return -1; 
} 

Обратите внимание, что эта функция дает булево выход, тогда как strcmp значений возвращают соответствующих лексикографические порядка двух входных строк.

+0

Стоит отметить, что strcmp() возвращает больше детализации, то есть может возвращать 0, -1 или 1. – asveikau

+0

Истина. Это упрощенная функция для генерации логического вывода. –

0

Вы можете использовать входную строку и переключатель на основе ее числового значения - для значений case используются хешированные значения символических констант. Вы можете создать внешний скрипт для создания файла заголовка с отображением «string» to «hash».

0

Я очень рекомендую Boost.Program options для обработки аргументов командной строки C++. Это может быть излишним для чего-то подобного, но для чего-то еще более сложного, библиотека опций Boost.Program - это меньше кода, более понятная после написания и позволяет вам придумывать такие вещи, как прием аргументов из файлов конфигурации или из переменных среды, или передача в командной строке, практически без работы.

Что-то примерно как следующее (непроверенные) должны работать для вас:

namespace po = boost::program_options; 

int main() { 
    po::options_description desc("Allowed options"); 
    desc.add_options() 
    ("help", "produce help message") 
    ("yes", "get down") 
    ("no", "get funky") 
    ; 

    po:variables_map vm; 
    po::store(po::parse_command_line(argc, argv, desc), vm); 
    po::notify(vm); 

    if (vm.count("yes")) { 
    // get down 
    } else if (vm.count("no")) { 
    // get funky 
    } 
} 

страница учебник дает ряд других примеров, которые показывают, что она практически не работают, чтобы добавить дополнительные, значительно более сложный, команда -строчные аргументы.

Обратите внимание, что повышение не включено по умолчанию в C++, но его обычно сложно добавить.Boost - один из тех наборов библиотек, о которых должны знать все программисты на C++. Пожалуйста, будьте предупреждены, что может быть излишним, если вы все еще учитесь C++.