Цикл C не выполняет должным образом все аспекты цикла.Циклы только на определенной части цикла - PullRequest
0 голосов
/ 21 сентября 2019

Итак, я хочу бесконечно проходить по циклу, принимать в качестве входных данных пользовательскую строку и затем сортировать ее.Я хочу непрерывно принимать ввод, пока пользователь не введет «ВЫХОД».Эта часть кода работает.Тем не менее, он не будет зацикливаться должным образом.(Это также в строгом C).

Он должен попросить пользователя ввести строку, отсортировать ее, напечатать ее, попросить пользователя ввести строку, отсортировать ее и т. Д.даёт ли он пользователю запрос на ввод строки, сортирует ее, печатает, затем печатает, печатает, печатает и т. д. Что здесь не так?Спасибо.

int main(){
    //Allocate a 100 character long array in the heap which will be passed and altered in place and outputted.
    //I'm not fully sure how to allocate dynamically the appropriate amount of space for strings without creating a whole class for it.
    //But seeing as this is c and not c++ then I'm not sure. Cause I need to have a length of how long the input is, but I need the memory allocated
    //to store the string ti find the length of.
    char* input = (char*)malloc(100);
    //Scanf allows input for any characters including white space.
    while(1){
        printf("Enter an input string: ");
        scanf("%[^\n]", input);

        int len = strlen(input);
        //Checks for exit condition. Input string being 'EXIT'
        if(len == 4 && input[0] == 'E' && input[1] == 'X' && input[2] == 'I' && input[3] == 'T'){
            break;
        }
        else{
        //Function calls
            remove_duplicates(input);
            sort(input);

            printf("\"%s\"\n", input);
        }
    }
    free(input);
    input = NULL;

    return 0;
}

1 Ответ

0 голосов
/ 22 сентября 2019

Множество спецификаторов формата для scanf пропускают начальные пробелы (например, новые строки), но не "%[".

Таким образом, новая строка, добавляемая вами при нажатии Введите в первом входе будет первым, что прочитает следующий вызов scanf.А с вашим форматом новая строка (или действительно, любой пробел) скажет scanf прекратить чтение, что означает, что больше ничего не будет прочитано.Снова и снова.

Я бы скорее рекомендовал использовать fgets для чтения строк, поскольку это также включало автоматическую защиту от переполнения буфера (при условии, что вы передали правильный размер буфера).

И если вы беспокоитесь о новой строке, добавленной fgets, ее легко удалить с помощью функции strcspn.

Так что лучше сделайте что-то вроде

char input[100];
while (fgets(input, sizeof input, stdin) != NULL)
{
    input[strcspn(input, "\n")] = 0;  // Remove possible trailing newline

    if (strcmp(input, "EXIT") == 0)
        break;  // Exit
    else
    {
        // Rest of code
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...