且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

什么`scanf函数(QUOT;%* [^ \\ n] *%C")`是什么意思?

更新时间: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.