更新时间:2022-10-23 20:06:44
击穿scanf函数(%* [^ \\ n]的%* C)
:
%* [^ \\ n]
扫描一切,直到 \\ n
(不扫描 \\ n
),并将其丢弃,即不存储扫描数据的任何地方。%* C
然后扫描并丢弃 \\ n
字符,高达其中第一个格式说明已经扫描。 两者%[
和%C
的格式说明。你可以看到他们这里 。在这两个符星号告诉 scanf函数
,不要储存这些格式说明符读取数据。
在你的情况,这 scanf函数
清除标准输入
当用户输入一个无效的输入。
I want to make a loop in C that, when the program asks for an integer and the user types a non-digit character, the program asks again for an integer.
I just found the below code. but I don't understand what this means scanf("%*[^\n]%*c")
. What does ^\n
mean? What does the *
before ^\n
and c
mean?
/*
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 <stdio.h>
//#include <stdlib.h>
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<=3 ; i++ ){
printf("Please, enter your score number %d: ", i+1);
//If the note is not valid, ask for it again
//This is tests if the user input is a valid integer.
if ( ( scanf("%d%c", &userScore, &testChar)!=2 || testChar!='\n')){
i-=1;
scanf("%*[^\n]%*c");
}else{ //Enter here if the user input is an integer
if ( userScore>=0 && userScore<=100 ){
//Add the value to the mean
meanValue += userScore;
}else{ //Enter here if the user input a non valid integer
i-=1;
//scanf("%*[^\n]%*c");
}
}
}
//Calculates the mean value of the 4 scores
meanValue = meanValue/4;
// Select your final grade according to the final mean
if (meanValue>= 90 && meanValue <=100){
grade = 'A';
} else if(meanValue>= 80 && meanValue <90){
grade = 'B';
} else if (meanValue>= 70 && meanValue <80){
grade = 'C';
} else if(meanValue>= 60 && meanValue <70){
grade = 'D';
}
printf("Your final score is: %2.2f --> %c \n\n" , meanValue, grade);
return 0;
}
Breakdown of scanf("%*[^\n]%*c")
:
%*[^\n]
scans everything until a \n
(Doesn't scan \n
) and discards it,i.e, doesn't store the scanned data anywhere.%*c
then scans and discards the \n
character, upto which the first format specifier has scanned.Both %[
and %c
are format specifiers. You can see what they do here. The asterisks in both the specifiers tell scanf
, not to store the data read by these format specifiers.
In your case, this scanf
clears the stdin
when the user enters an invalid input.