Что означает `scanf (“% * % * c “)` означает?

Я хочу сделать цикл в C, когда программа запрашивает целое число, а пользователь вводит нецифровой символ, программа снова запрашивает целое число.

Я только что нашел код ниже. но я не понимаю, что это означает scanf("%*[^\n]%*c") . Что означает ^\n ? Что означает * до того, как ^\n и c означают?

 /* This program calculate the mean score of an user 4 individual scores, and outputs the mean and a final grade Input: score1, score2,score2, score3 Output: Mean, FinalGrade */ #include  //#include  int main(void){ int userScore = 0; //Stores the scores that the user inputs float meanValue = 0.0f; //Stores the user mean of all the notes char testChar = 'f'; //Used to avoid that the code crashes char grade = 'E'; //Stores the final int i = 0; //Auxiliar used in the for statement printf("\nWelcome to the program \n Tell me if Im clever enough! \n Designed for humans \n\n\n"); printf("Enter your 4 notes between 0 and 100 to calculate your course grade\n\n"); // Asks the 4 notes. for ( ; i=0 && userScore= 90 && meanValue = 80 && meanValue = 70 && meanValue = 60 && meanValue  %c \n\n" , meanValue, grade); return 0; } 

Разбивка scanf("%*[^\n]%*c") :

  • %*[^\n] сканирует все до \n , но не сканирует в \n . Звездочка ( * ) сообщает ему отменить все, что было отсканировано.
  • %*c сканирует один символ, который в этом случае будет \n оставлен %*[^\n] . Звездочка указывает scanf на отбрасывание отсканированного символа.

Оба %[ и %c являются спецификаторами формата. Вы можете видеть, что они здесь делают. Звездочки в обоих спецификаторах scanf , а не на сохранение данных, считываемых этими спецификаторами формата.

В вашем случае этот scanf очищает stdin когда пользователь вводит недопустимый ввод.


Лучше использовать

 scanf("%*[^\n]"); scanf("%*c"); 

для очистки stdin . Это связано с тем, что в первом случае (single scanf ), %*[^\n] будет терпеть неудачу, когда первый проверенный символ будет символом \n а остальная часть строки формата scanf будет пропущена, что означает, что %*c не будет функционировать и, таким образом, \n от входа все равно будет во входном streamе. В этом случае это произойдет не так, как даже при первом отказе scanf , второй будет выполняться, поскольку они являются отдельными операторами scanf .

Вы можете взять строку в качестве входа в C, используя scanf(“%s”, s) . Но он принимает строку только до тех пор, пока не найдет первое пространство.

Чтобы взять строку в качестве входа, вы можете использовать scanf("%[^\n]%*c", s); где s определяется как char s[MAX_LEN] где MAX_LEN – максимальный размер s . Здесь [] – это символ сканирования. ^\n означает ввод ввода до тех пор, пока не появится новая строка. Затем, с этим %*c , он читает символ новой строки, и здесь используемый символ * указывает, что этот символ новой строки отбрасывается.

Давайте будем гением компьютера.