C语言如何读取键盘输入的字符串
在C语言中,读取键盘输入的字符串是一个常见的操作,使用scanf
函数、gets
函数、fgets
函数等方式可以实现。本文将详细介绍这几种方式,并推荐使用fgets
函数,因为它更安全、灵活。接下来,我将详细讲解为什么推荐使用fgets
函数。
fgets
函数相比于scanf
和gets
函数有几个重要的优点。首先,fgets
函数可以指定读取的最大字符数,从而避免缓冲区溢出的问题。其次,它可以读取包含空格的字符串,而scanf
和gets
在遇到空格时会停止读取。最后,fgets
函数在读取到换行符时会将其包括在结果中,这使得处理多行输入更加方便。
一、使用scanf
函数读取字符串
1、基本用法
scanf
函数是C语言中最常用的输入函数之一。它可以从标准输入(通常是键盘)读取数据,并根据格式说明符将数据存储到指定的变量中。使用scanf
函数读取字符串时,格式说明符是%s
。
#include <stdio.h>
int main() {
char str[100];
printf("请输入一个字符串:");
scanf("%s", str);
printf("你输入的字符串是:%sn", str);
return 0;
}
2、注意事项
使用scanf
函数读取字符串时,有几个注意事项需要牢记。首先,scanf
函数在遇到空格、制表符或换行符时会停止读取。因此,输入的字符串不能包含这些字符。其次,scanf
函数没有对缓冲区溢出进行检查,如果用户输入的字符串长度超过了缓冲区的大小,就会发生缓冲区溢出,从而导致程序崩溃或行为异常。
二、使用gets
函数读取字符串
1、基本用法
gets
函数也是C语言中的一种输入函数。它可以从标准输入读取一行字符串,并将其存储到指定的字符数组中。
#include <stdio.h>
int main() {
char str[100];
printf("请输入一个字符串:");
gets(str);
printf("你输入的字符串是:%sn", str);
return 0;
}
2、安全隐患
gets
函数的一个重大缺陷是它没有对输入的长度进行检查,这使得它容易导致缓冲区溢出。正因为这个原因,gets
函数在C11标准中已经被弃用,建议尽量避免使用。
三、推荐使用fgets
函数读取字符串
1、基本用法
fgets
函数是C语言中更为安全和灵活的输入函数。它可以从指定的输入流(通常是标准输入)读取一行字符串,并将其存储到指定的字符数组中。fgets
函数允许指定读取的最大字符数,从而有效防止缓冲区溢出。
#include <stdio.h>
int main() {
char str[100];
printf("请输入一个字符串:");
fgets(str, sizeof(str), stdin);
printf("你输入的字符串是:%sn", str);
return 0;
}
2、处理换行符
fgets
函数在读取到换行符时会将其包括在结果中。这在某些情况下可能不是我们想要的,因此我们可以手动去除换行符。
#include <stdio.h>
#include <string.h>
int main() {
char str[100];
printf("请输入一个字符串:");
fgets(str, sizeof(str), stdin);
// 去除换行符
str[strcspn(str, "n")] = '