Cprogramming 简明教程

C - User Input

Need for User Input in C

每个计算机应用程序都从用户那里接受某些数据,对这些数据执行预定义的处理以生成输出。C 中没有可以读取用户输入的关键字。

与 C 编译器捆绑在一起的标准库包括 stdio.h header file ,其库函数 scanf() 最常用于 accept user input from the standard input stream 。此外, stdio.h 库还提供其他用于接受输入的函数。

Example

为了了解用户输入的必要性,请考虑以下 C 程序 −

#include <stdio.h>

int main(){
   int price, qty, ttl;

   price = 100;
   qty = 5;
   ttl = price*qty;

   printf("Total: %d", ttl);

   return 0;
}

上面的程序通过将购买的商品价格和数量相乘来计算总购买金额。运行该代码并检查其输出 −

Total: 500

对于价格和数量具有不同值的另一笔交易,你需要编辑程序,输入值,然后再次编译并运行。每次都这样做是一项繁琐的任务。相反,必须在运行程序后提供将值分配给变量的规定。 scanf() 函数在运行时读取用户输入,并将值分配给一个变量。

C User Input Function: The scanf()

C language 将标准输入流识别为 stdin ,并由键盘等标准输入设备表示。C 总是以字符的形式从输入流中读取数据。

scanf() function 使用适当的格式说明符将输入转换为所需的 data type

Syntax of Scanf()

以下是如何在 C 中使用 scanf() 函数 −

int scanf(const char *format, &var1, &var2, . . .);

scanf() 函数的第一个参数是一个格式字符串。它指示要将用户输入解析到的变量的数据类型。后面跟着一个或多个 pointers 相关的 variables 。由 & 前缀的变量名称提供变量的地址。

User Input Format Specifiers

在格式字符串中使用以下格式说明符 −

Format Specifier

Type

%c

Character

%d

Signed integer

%f

Float values

%i

Unsigned integer

%l 或 %ld 或 %li

Long

%lf

Double

%Lf

Long double

%lu

无符号int 或无符号 long

%lli or %lld

Long long

%llu

Unsigned long long

Example: User Inputs in C

回到前面的示例,我们将使用 scanf() 函数来接受“price”和“qty”的值,而不是为它们分配任何固定值。

#include <stdio.h>

int main(){

   int price, qty, ttl;

   printf("Enter price and quantity: ");
   scanf("%d %d", &price, &qty);

   ttl = price * qty;

   printf("Total : %d", ttl);

   return 0;
}

当运行上述程序时,C 等待用户输入值 −

Enter price and quantity:

输入值并按 Enter 后,程序将继续执行后续步骤。

Enter price and quantity: 100 5
Total : 500

更重要的是,对于另一组值,您不需要再次进行编辑和编译。只需运行代码,程序将再次等待用户输入。这样,该程序可以使用不同的输入运行任意多次。

Enter price and quantity: 150 10
Total : 1500

Integer Input

%d 格式说明符已定义为有符号整型。以下程序读取用户输入并将其存储在整数变量 num 中。

Example: Integer Input in C

查看以下程序代码 -

#include <stdio.h>

int main(){

   int num;

   printf("Enter an integer: ");
   scanf("%d", &num);

   printf("You entered an integer: %d", num);

   return 0;
}

运行代码并检查其输出:

Enter an integer: 234
You entered an integer: 234

如果你输入一个非数字化的值,输出将是“0”。

scanf() 函数可以读取一个或多个变量的值。在你提供输入值时,你必须使用空格、标签或 Enter 分隔连续的值。

Example: Multiple Integer Inputs in C

#include <stdio.h>

int main(){

   int num1, num2;

   printf("Enter two integers: ");
   scanf("%d %d", &num1, &num2);

   printf("You entered two integers : %d and %d", num1, num2);

   return 0;
}

运行代码并检查其输出:

Enter two integers: 45 57
You entered two integers : 45 and 57

Enter two integers: 45
57

Float Input

对于浮点输入,你需要使用 %f 格式说明符。

Example: Float Input in C

#include <stdio.h>

int main(){

   float num1;

   printf("Enter a number: ");
   scanf("%f", &num1);

   printf("You entered a floating-point number: %f", num1);

   return 0;
}

运行代码并检查其输出:

Enter a number: 34.56
You entered a floating-point number: 34.560001

Example: Integer and Float Inputs in C

scanf() 函数可能读取不同类型变量的输入。在以下程序中,用户输入存储在整型和浮点变量中 -

#include <stdio.h>

int main(){

   int num1;
   float num2;

   printf("Enter two numbers: ");
   scanf("%d %f", &num1, &num2);

   printf("You entered an integer: %d a floating-point number: %6.2f", num1, num2);

   return 0;
}

运行代码并检查其输出:

Enter two numbers: 65 34.5678
You entered an integer: 65 a floating-point number:  34.57

Character Input

%c 格式说明符读取键盘单个字符。然而,我们必须在格式字符串中的 %c 之前留一个空格。这是因为 %c 转换说明符不会自动跳过任何首个空格。

如果有杂乱的新行在输入流(例如,来自之前的条目)中, scanf() 调用会立刻消耗它。

scanf(" %c", &c);

格式字符串中的空格告诉 scanf 跳过首个空格,首个非空格字符将使用 %c 转换说明符读取。

Example: Character Input in C

请看以下示例:

#include <stdio.h>

int main(){

   char ch;

   printf("Enter a single character: ");
   scanf(" %c", &ch);

   printf("You entered character : %c", ch);

   return 0;
}

运行代码并检查其输出:

Enter a single character: x
You entered character : x

Example: Multiple Character Inputs in C

以下程序读取两个字符,它们在两个 char 变量中使用空格分隔。

#include <stdio.h>

int main(){

   char ch1, ch2;

   printf("Enter two characters: ");
   scanf("%c %c", &ch1, &ch2);

   printf("You entered characters: %c and %c", ch1, ch2);

   return 0;
}

运行代码并检查其输出:

Enter two characters: x y
You entered characters: x and y

stdio.h 头文件也提供 getchar() function 。不同于 scanf(), getchar() 没有格式字符串。另外,它读取单个键击而不使用 Enter 键。

Example: Character Input Using gets()

以下程序将单个键读入 char 变量中:

#include <stdio.h>

int main(){

   char ch;

   printf("Enter a character: ");
   ch = getchar();

   puts("You entered: ");
   putchar(ch);

   printf("\nYou entered character: %c", ch);

   return 0;
}

运行代码并检查其输出:

Enter a character: W
You entered:
W
You entered character: W

你也可以使用未格式的 putchar() 函数打印单个字符。

Example: Reading a Character Sequence

以下程序显示了如何读取一系列字符,直到用户按下 Enter 键:

#include <stdio.h>

int main(){

   char ch;
   char word[10];

   int i = 0;
   printf("Enter characters. End by pressing the Enter key: ");

   while(1){
      ch = getchar();
      word[i] = ch;
      if (ch == '\n')
         break;
      i++;
   }
   printf("\nYou entered the word: %s", word);

   return 0;
}

运行代码并检查其输出:

Enter characters. End by pressing the Enter key: Hello

You entered the word: Hello

String Input

还有一个 %s 格式说明符,它将一系列字符读取到 char 数组中。

Example: String Input Using scanf()

以下程序接受键盘的 string 输入 -

#include <stdio.h>

int main(){

   char name[20];

   printf("Enter your name: ");
   scanf("%s", name);

   printf("You entered the name: %s", name);

   return 0;
}

运行代码并检查其输出:

Enter your name: Ravikant
You entered the name: Ravikant

C 使用空格作为分隔字符。因此,如果你尝试输入包含空格的字符串,那么只有空格之前的字符将存储为该值。

Enter your name: Ravikant Soni
You entered the name: Ravikant

gets() function 克服了这个限制。这是一个未格式化的字符串输入函数。所有字符(直到你按 Enter)都存储在该变量中。

Example: String Input Using gets()

请看以下示例:

#include <stdio.h>
#include <stdlib.h>

int main(){

   char name[20];

   printf("Enter your name: ");
   gets(name);

   printf("You entered the name: %s", name);

   return 0;
}

运行代码并检查其输出:

Enter your name: Ravikant Soni
You entered the name: Ravikant Soni

用户输入是 C 编程中应用程序一个重要的方面。在本章中,我们使用不同的示例解释了格式化和非格式化的控制台输入函数, scanf()getchar()gets() 的使用。