Язык C: Turbo C, DOS, ввод = 4. вывод =$ $$ $$$ $$$$. Идет бесконечный цикл для ввода символов. С

Пользователь вводит данные, и, соответственно, шаблон должен быть распечатан. Он должен встречать отрицательные числа и char в качестве входных данных. Я столкнулся с отрицательным значением в качестве ввода, но когда я пытаюсь ввести char, он переходит в бесконечный цикл. Итак, как я могу встретить значение char для типа данных int в качестве входных данных.

#include<stdio.h>
#include<conio.h>
/*
C program to print the pattern allowing user
to input the no. of lines.
*/

//Declaring method for printing pattern
void printPattern(int numberOfLines);

void main()
{
    char userChoice;//User's choice to continue or exit
    int numberOfLines;//User's input for number line to be printed

    clrscr();

    //Logic for printing the pattern
    do
    {
        printf("Enter the number of lines you want to print \n");
        scanf("%d",&numberOfLines);

        //Countering issue if user enters a char insted of number
        /*while()
        {
            printf("Enter number only \n");
            scanf(" %c",&numberOfLines);
        }*/

        //Countering issue if user enters negative number
        while(numberOfLines<=0)
        {
            printf("Enter positive number \n");
            scanf("%d",&numberOfLines);
        }

        //Calling method to the start printing of method
        printPattern(numberOfLines);

        //Taking user's choice to continue or not
        printf("Press Y to continue else any other key to exit \n");
        scanf(" %c",&userChoice);
    }
    while(userChoice == 'y' || userChoice == 'Y');
}

/*
Method  definition for printing the pattern
Argument numberOfLines: User's input for number of lines
*/
void printPattern(int numberOfLines)
{
    int i,j;
    for(i=0 ; i<numberOfLines ; i++) //for rows
    {
        for(j=0 ; j<=i  ; j++) //for columns
        {
            printf("$");
        }
        printf("\n"); //for going to next row after printing one
    }
}```

person Wackie    schedule 25.12.2019    source источник
comment
Теговый спам удален. Давайте попробуем остаться на цели, не так ли?   -  person WhozCraig    schedule 25.12.2019
comment
Входные данные должны быть приняты в string и преобразованы в целое число.   -  person TruthSeeker    schedule 25.12.2019
comment
Почему вы читаете параметр из стандартного ввода? Вместо этого возьмите его из argv. Не используйте scanf, пока у вас не появится больше опыта.   -  person William Pursell    schedule 25.12.2019
comment
Что такое argv? @Уильям Перселл   -  person Wackie    schedule 26.12.2019
comment
@Wackle argv — это обычное имя для второго аргумента, передаваемого в main. Это список строк, переданных в командной строке.   -  person William Pursell    schedule 27.12.2019
comment
относительно: void main() Есть только две допустимые подписи для функции: main() Это: int main( void ) и int main( int argc, char *argv[] ) Обратите внимание, что они оба имеют тип возвращаемого значения int, НЕ void   -  person user3629249    schedule 27.12.2019


Ответы (2)


Когда вы делаете scanf("%d",&numberOfLines);, вы хотите прочитать целое число. Если вы затем введете букву, например a, из входного потока ничего не будет прочитано. Другими словами, вы войдете в бесконечный цикл, в котором вы продолжаете пытаться прочитать целое число, но поток содержит букву.

Вам нужно удалить это письмо из потока.

Вы можете попробовать:

while(scanf("%d",&numberOfLines) != 1)
{
    // Didn't get an integer so remove a char
    getchar();
}

Однако это приведет к проблемам, если входной поток выйдет из строя.

Лучшее решение — использовать fgets и sscanf.

person 4386427    schedule 25.12.2019
comment
Спасибо за решение брат. Не могли бы вы подробно объяснить значение while(scanf("%d",&numberOfLines) != 1). Потому что код работал, но я не знаю значения этого условия в цикле while - person Wackie; 25.12.2019
comment
@Wackie Функция scanf возвращает количество успешно сопоставленных элементов. Итак, если 1 целое число соответствует (и сохраняется в numberOfLines), функция возвращает 1. Таким образом, в этом случае у вас есть while(1 != 1), что является ложным и, следовательно, останавливает цикл. Но если целое число не совпадает, scanf вернет 0, и у вас будет: while(0 != 1), что верно, и цикл продолжится. Таким образом, все вместе это означает, что цикл будет продолжаться до тех пор, пока вы не найдете целое число. - person 4386427; 27.12.2019

Вот более короткая и простая версия printPattern

void printPattern(int n)
{
    char dollar[n];
    memset(dollar, '$', n);

    for(int i = 1; i <= n; ++i)
        printf("%.*s\n", i, dollar);
}
person abelenky    schedule 25.12.2019