Попытка создать программу, которая сравнивает строки ввода пользователя с набором предопределенных строк ввода в C - PullRequest
0 голосов
/ 12 марта 2019

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

Входные строки - это массив строк, например:

char *input_strings[] = { 
    "Hello", "What is your name?", "How are you?", "Bye"
};

То, что у меня сейчас есть, это набор функций:

1) uppercheck, который проверяет, является ли значение заглавным или нет:

int uppercheck(int c){
    return (c >= 'A' && c <= 'Z');
}

2) нижний регистр, который преобразует значение в нижний регистр:

int lowercase(int c){
    if (uppercheck(c)){
        c + 0x20;
    }
    else{
        c;
    }
}

3) compstr, который сравнивает две строчные буквы:

int result;
int compstr(char str1[], char str2[]){
    for(int i = 0; str1[i]; i++){
        if (lowercase(str1[i]) == lowercase(str2[i])){
            result = 1;
        }
        else{
            result = 0;
        }
    }
    return result;
}

Последняя часть моего кода проверяет, равна ли строка пользователя каждой записи в массиве input_strings, например:

char input[100]; // user input string
while (1) // infinite loop
{ 
    //Get the input string
    printf("> ");
    fgets(input, 100, stdin);

    // comparing strings:

    //3 base input conditions:
    if (compstr(input_strings[0], input) == 1)
    {
        printf("Hello\n");
    }
    else if (compstr(input_strings[1], input) == 1)
    {
        printf("My name is Name\n");
    }
    else if (compstr(input_strings[2], input) == 1)
    {
        printf("I am fine\n");
    }
    //exit condition:
    else if (compstr(input_strings[3], input) == 1) 
    {
        printf("Bye\n"); 
        break;
    }
    //invalid input:
    else 
    {   
        printf("I do not understand\n");
    }
}
return 0;

Моя проблема в том, что программа выведет «Hello» для ЛЮБОГО ввода, даже если ввода вообще нет. Я думал, что функция сравнения будет гарантировать, что две строки идентичны, но, похоже, это не работает, и я не уверен, как подойти к нему отсюда. Извините, если я переборщил с кодом, но решил, что добавлю как можно больше информации. Любая помощь будет принята с благодарностью!

1 Ответ

1 голос
/ 25 марта 2019

Итак, вы забыли написать return в функции lowercase и не ставили break; после result = 0;, и код должен работать нормально.

Пояснение:

В вашем коде есть только одно место, которое печатает Hello, поэтому мы знаем, что выражение printf("Hello\n") выполняется в каждом цикле. Это означает, что оператор if, расположенный непосредственно над этим выражением, каждый раз оценивается в true, что может произойти, только если функция compstr() всегда возвращает 1 независимо от того, что является input. Теперь давайте погрузимся в функцию compstr() и посмотрим, откуда взялся 1.

Ну, переменная result установлена ​​в 1, если lowercase(str1[i]) равно lowercase(str2[i]). Итак, наша проблема в том, что lowercase(str1[i]) всегда совпадает с lowercase(str2[i]). Проверьте вашу lowercase() функцию. Вы вообще не написали никакого оператора возврата в функции, и поэтому он всегда будет возвращать число мусора независимо от того, что является c. По сути, все, что вам нужно сделать, это изменить c + 0x20; на return c + 0x20; и c; на return c;. Вот и все. Очень простая ошибка.

Теперь гораздо большая проблема в том, что у вас нет оператора break после назначения result = 0; в функции compstr() следующим образом:

...
        else{
            result = 0;
            break;
        }
...

Почему этот перерыв важен? Ну, это актуально только тогда, когда str1 длиннее str2. Видите, условие завершения вашего цикла for включает только str1, поэтому даже когда мы достигаем последнего символа в str2, мы все равно продолжаем цикл, если str1 длиннее str2. Давайте посмотрим на пример сценария. Запустим программу и наберем Hello. Программа сохраняет Hello в input, например, input = {'H', 'e', 'l', 'l', 'o', '\0', ...}, а затем проверяет первое условие ввода с помощью compstr() и печатает Hello. Теперь наберите Bye. Теперь массив input равен {'B', 'y', 'e', '\0', 'o', '\0', ...}. Заметьте, как o из Hello все еще там? Цикл for в compstr установит result в 0 при первом сравнении символов, что нормально, но без перерыва, он будет продолжать цикл даже после сравнения последнего e в Bye, потому что вы сравниваем его с Hello, который имеет 5 символов, а не 3. В последнем цикле ваш оператор if будет сравнивать 5-й символ Hello и 5-й символ Bye, что является буквой o для и то и другое. и поэтому result устанавливается в 1 в конце цикла, и поэтому функция compstr возвращает 1, а затем программа печатает Hello вместо Bye, даже если вы набрали Bye, потому что Bye короче Hello. Попробуйте, How are you?, и он будет печатать I am fine в обычном режиме, но теперь, если вы наберете Hello или Bye, вы все равно получите I am fine, потому что input выглядит так: 'H', 'e', 'l', 'l', 'o', '\0', 'e', ' ', 'y', 'o', 'u', '?', '\0' .... e you? в конце является значением мусора от нескольких шагов назад, когда мы сохранили How are you? в той же самой переменной input.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...