C语言将字符串输入数组的方式多种多样,主要方法包括:使用scanf
函数、使用gets
函数、使用fgets
函数、逐字符输入等。其中,fgets
函数是最安全和推荐的方式,因为它能够有效防止缓冲区溢出问题。下面将详细介绍这些方法以及相关注意事项。
一、使用scanf
函数
scanf
函数是C语言中用于从标准输入读取数据的函数。它可以用于将字符串输入到字符数组中。
#include <stdio.h>
int main() {
char str[100];
scanf("%99s", str);
printf("You entered: %sn", str);
return 0;
}
优点:
- 简单、易用。
缺点:
scanf
读取到空白字符(如空格、回车)时会停止,这意味着无法读取含有空格的字符串。- 不安全,如果用户输入的字符串长度超过数组大小,可能会导致缓冲区溢出。
二、使用gets
函数
gets
函数可以读取一行输入,并将其存储到一个字符数组中。
#include <stdio.h>
int main() {
char str[100];
gets(str);
printf("You entered: %sn", str);
return 0;
}
优点:
- 可以读取包含空格的整行输入。
缺点:
- 极不安全,没有办法限制输入长度,可能导致缓冲区溢出,已被C11标准弃用。
三、使用fgets
函数
fgets
函数是推荐的读取字符串的方法,它可以指定最大输入长度,防止缓冲区溢出。
#include <stdio.h>
int main() {
char str[100];
if (fgets(str, sizeof(str), stdin) != NULL) {
printf("You entered: %s", str);
}
return 0;
}
优点:
- 安全,可以防止缓冲区溢出。
- 能读取包含空格的整行输入。
缺点:
- 输入的字符串可能包含换行符,需要手动处理。
四、逐字符输入
逐字符输入可以通过循环读取每个字符,并将其存储到字符数组中,直到遇到换行符或文件结束符。
#include <stdio.h>
int main() {
char str[100];
int i = 0;
char ch;
while ((ch = getchar()) != 'n' && ch != EOF && i < sizeof(str) - 1) {
str[i++] = ch;
}
str[i] = '