C 控制台输入

学习C - C控制台输入

输入格式控制字符串

下表列出了scanf函数的转换字符及其含义。

转换字符含义
d将输入读取为带符号的十进制整数。
i将输入读取为有符号整数。如果输入从0开始,则输入被假定为八进制。如果输入以0x或0X开始,则假设为十六进制输入;否则为十进制输入。
o读取输入,假设它是一个带符号的八进制整数。
u将输入读取为无符号整数。
x将输入读取为带符号的十六进制整数。
c读取字段宽度指定的字符数为类型char,包括空格。如果字段宽度规范不存在,将读取一个字符。要忽略前面的空格,请在格式规范之前加一个空白字符。
s读取一串连续的非空白字符作为类型char,从下一个非空白字符开始。
[]从方括号中的指定集中读取字符。集合中没有找到的第一个字符结束输入。%[] ab]读取字符,只要它们是a,b或。只要不是a,b或],%[^] ab]读取字符。
a,A,e,E,f,F,G 或 g将输入转换为float类型。输入中的符号,小数点和指数是可选的。
%读取一个%字符。跳过%字符是%%。
p读取输入作为指针。参数应为void **类型。
n没有读取输入,但从键盘读取的字符数存储在参数中。

下表列出了转换规格中的选项示例。

规范描述
%lf读取下一个值作为double类型。
%*d读取下一个整数值,但不要存储它。
%15c读取接下来的15个字符作为类型char。
\n%c读取下一个字符为类型char忽略空格字符。
%10lld读取接下来的十个字符作为long long类型的整数值。
%Lf读取下一个值作为long double类型的浮点值。
%hu读取下一个值作为无符号短类型。

    #include <stdio.h> 

    int main(void) { 
      int i = 0; 
      int j = 0; 
      int value_count = 0; 
      float fp1 = 0.0f; 
      printf("Enter: fp1 = 3.1 i = 7 8\n"); 
      
      printf("\nInput:"); 
      value_count = scanf("fp1 = %f i = %d %d", &fp1, &i , &j); 
      printf("\nOutput:\n"); 
      printf("Count of values read = %d\n", value_count); 
      printf("fp1 = %f\ti = %d\tj = %d\n", fp1, i, j); 
      return 0; 
    } 

上面的代码生成以下结果。

浮点输入的变化


#include <stdio.h> 

int main(void) 
{ 
  float fp1 = 0.0f; 
  float fp2 = 0.0f; 
  float fp3 = 0.0f; 
  int value_count = 0; 
  printf("Enter: 3.14.314E1.0314e+02\n"); 
  
  printf("Input:\n"); 
  value_count = scanf("%f %f %f", &fp1, &fp2, &fp3); 
  
  printf("\nOutput:\n"); 
  printf("Number of values read = %d\n", value_count); 
  printf("fp1 = %f  fp2 = %f  fp3 = %f\n", fp1, fp2, fp3); 
  return 0; 
} 

上面的代码生成以下结果。

读取十六进制和八进制值

我们可以使用格式说明符%x从输入流读取十六进制值。

对于八进制值,您使用%o。


    #include <stdio.h> 

    int main(void) { 
      int i = 0; 
      int j = 0; 
      int k = 0; 
      int n = 0; 
      
      printf("Enter three integer values:"); 
      n = scanf(" %d %x %o", &i , &j, &k ); 
      
      printf("\nOutput:\n"); 
      printf("%d values read.\n", n); 
      printf("i = %d   j = %d   k = %d\n", i, j, k ); 
      return 0; 
    } 

上面的代码生成以下结果。

使用scanf()读取字符

您可以使用格式说明符%c读取单个字符并将其存储为类型char。

要读取一串字符,您可以使用说明符%s或说明符%[]。

%[aeiou]将读取仅由元音组成的字符串。

不是元音的第一个字符将表示字符串的末尾。

%[^ aeiou]读取一个字符串,其中包含不是元音的任何字符。

第一个元音或空格字符将表示字符串的末尾。

%[]规范使您能够读取一个包含空格的字符串,并且%s规范不能这样做。

您只需要将一个空格作为方括号之间的字符之一。


    #include <stdio.h> 

    int main(void){ 
      char initial = " "; 
      char name[80] = { " " }; 
      char age[4] = { "0" }; 
      printf("Enter your first initial: "); 
      scanf("%c", &initial, sizeof(initial)); 
      printf("Enter your first name: " ); 
      scanf("%s", name, sizeof(name)); 
      fflush(stdin); 
      
      if(initial  != name[0]) 
        printf("%s,you got your initial wrong.\n", name); 
      else 
        printf("Hi, %s. Your initial is correct. Well done!\n", name ); 
      
      printf("Enter your name and age separated by a comma:\n" ); 
      scanf_s("%[^,] , %[0123456789]", name, sizeof(name), age, sizeof(age)); 
      printf("\name is %s is %s years old.\n", name, age ); 
      return 0; 
    } 

上面的代码生成以下结果。