文章目录
- 一、C 输入 & 输出
- 1. 输出(Output)
- 2. 输入(Input)
- 3. 示例:使用`fgets`读取字符串
- 二、C 输入/输出-常见问题
- 1. 缓冲区问题
- 2. 字符串输入问题
- 3. 混合输入问题
- 三、相关链接
一、C 输入 & 输出
在C语言中,输入和输出主要通过标准库函数printf
和scanf
进行。这些函数在stdio.h
头文件中定义。
1. 输出(Output)
printf
函数用于向标准输出(通常是屏幕)发送格式化的输出。其基本语法如下:
#include <stdio.h>
int main() {
int num = 10;
float fnum = 20.5;
char str[] = "Hello, World!";
printf("整数: %d\n", num);
printf("浮点数: %f\n", fnum);
printf("字符串: %s\n", str);
return 0;
}
在上面的代码中,%d
、%f
和%s
是格式说明符,它们告诉printf
如何解释后续的参数,并将它们转换为相应的字符串形式。
2. 输入(Input)
scanf
函数用于从标准输入(通常是键盘)读取格式化的输入。其基本语法如下:
#include <stdio.h>
int main() {
int num;
float fnum;
char str[50];
printf("请输入一个整数: ");
scanf("%d", &num);
printf("请输入一个浮点数: ");
scanf("%f", &fnum);
printf("请输入一个字符串: ");
scanf("%49s", str); // 注意使用49而不是50,为字符串的结尾符'\0'留空间
printf("整数: %d\n", num);
printf("浮点数: %f\n", fnum);
printf("字符串: %s\n", str);
return 0;
}
在scanf
中,&
符号用于获取变量的地址,因为scanf
需要知道将数据存储在哪里。同样,格式说明符(如%d
、%f
和%s
)用于告诉scanf
如何解释输入的数据。
注意:对于字符串输入,%s
格式说明符会读取直到遇到空白字符(如空格、制表符或换行符)为止。因此,如果你输入了一个包含空格的字符串,scanf
只会读取到第一个空格为止。如果你需要读取包含空格的字符串,你应该使用其他方法,如fgets
函数。
3. 示例:使用fgets
读取字符串
#include <stdio.h>
int main() {
char str[100];
printf("请输入一个字符串: ");
fgets(str, sizeof(str), stdin); // 从标准输入读取字符串
// fgets会读取换行符,所以可能需要手动删除它
str[strcspn(str, "\n")] = 0;
printf("你输入的字符串是: %s\n", str);
return 0;
}
在这个示例中,fgets
函数用于从标准输入(stdin
)读取一个字符串,并将其存储在str
数组中。注意,我们传递了sizeof(str)
作为fgets
的第二个参数,以确保不会读取超过数组大小的数据。同时,我们使用strcspn
函数来查找换行符的位置,并将其替换为字符串的结尾符(\0
)。
二、C 输入/输出-常见问题
在使用C语言进行输入和输出时,确实会遇到一些常见问题。以下是一些常见问题及其详细代码案例:
1. 缓冲区问题
问题:在使用scanf
函数时,如果用户输入了多余的数据(比如输入了一个整数后还按下了回车,但是接下来的输入需要另一个字符),那么这些数据会被留在输入缓冲区中,导致下一次scanf
读取错误的数据。
解决方案:可以使用fflush(stdin)
来清空输入缓冲区,但需要注意的是,fflush(stdin)
在C语言标准中是未定义的,其行为可能因编译器和平台而异。更好的做法是使用其他方法来处理这个问题,比如读取并丢弃直到遇到换行符。
代码案例:
#include <stdio.h>
int main() {
int num1, num2;
char ch;
printf("请输入一个整数: ");
scanf("%d", &num1);
// 尝试清空缓冲区(不推荐使用 fflush(stdin))
// 更好的做法是直接读取并丢弃直到换行符
// while ((ch = getchar()) != '\n' && ch != EOF);
// 假设我们直接输入了另一个整数而没有按回车,那么下面的scanf会读取错误的数据
printf("请输入另一个整数: ");
scanf("%d", &num2); // 这里可能会读取到上一个输入遗留的数据
printf("你输入的两个整数是: %d 和 %d\n", num1, num2);
return 0;
}
2. 字符串输入问题
问题:使用scanf
读取字符串时,如果用户输入的字符串长度超过了为字符数组分配的空间,就会发生缓冲区溢出。
解决方案:使用fgets
代替scanf
来读取字符串,因为fgets
允许你指定读取的最大字符数(包括结尾的空字符)。
代码案例:
#include <stdio.h>
#include <string.h>
#define MAX_LENGTH 50
int main() {
char str[MAX_LENGTH];
printf("请输入一个字符串: ");
fgets(str, MAX_LENGTH, stdin); // 读取最多 MAX_LENGTH-1 个字符(为 '\0' 留空间)
// 去除可能的换行符
str[strcspn(str, "\n")] = 0;
printf("你输入的字符串是: %s\n", str);
return 0;
}
3. 混合输入问题
问题:当你尝试在一个循环中混合使用scanf
读取整数和字符时,可能会遇到问题,因为scanf
在读取字符时不会跳过空白字符(如空格、制表符或换行符)。
解决方案:在读取字符之前,使用scanf
的一个空格控制符来跳过空白字符,或者改用getchar()
(配合循环来读取直到非空白字符)来读取字符。
代码案例:
#include <stdio.h>
int main() {
int num;
char ch;
printf("请输入一个整数: ");
scanf("%d", &num);
// 跳过空白字符
while ((ch = getchar()) == ' ' || ch == '\t' || ch == '\n');
// 现在 ch 包含了用户输入的第一个非空白字符
printf("你输入的非空白字符是: %c\n", ch);
return 0;
}
或者,使用scanf
的空格控制符:
#include <stdio.h>
int main() {
int num;
char ch;
printf("请输入一个整数: ");
scanf("%d", &num);
// 使用空格控制符跳过空白字符
scanf(" %c", &ch); // 注意%c前的空格
printf("你输入的非空白字符是: %c\n", ch);
return 0;
}
三、相关链接
- Visual Studio Code下载地址
- Sublime Text下载地址
- 「C系列」C 简介
- 「C系列」C 基本语法
- 「C系列」C 数据类型
- 「C系列」C 变量及常见问题梳理
- 「C系列」C 常量
- 「C系列」C 存储类
- 「C系列」C 运算符
- 「C系列」C 判断/循环
- 「C系列」C 函数
- 「C系列」C 作用域规则
- 「C系列」C 数组
- 「C系列」C enum(枚举)
- 「C系列」C 指针及其应用案例