在C语言中输入多个字符数组的几种方法包括:使用scanf、使用gets/fgets、使用动态分配内存。这三种方法各有优缺点,具体选择应根据实际需求和编程环境而定。scanf较为简单,但存在缓冲区溢出风险。gets/fgets可以读取整行输入,动态分配内存则提供了更大的灵活性和安全性。下面我们详细探讨这几种方法及其实现方式。
一、USING SCANF
scanf
是C语言中最常用的输入函数之一。它可以用于读取多个字符数组,即多个字符串。以下是使用 scanf
输入多个字符数组的基本方法。
1.1、基本用法
使用 scanf
来读取多个字符数组时,可以通过循环或者多个 scanf
语句来实现:
#include <stdio.h>
int main() {
char str1[100], str2[100], str3[100];
printf("Enter three strings:n");
scanf("%s %s %s", str1, str2, str3);
printf("You entered: %s, %s, %sn", str1, str2, str3);
return 0;
}
在这个例子中,scanf 读取了三个字符串,并将它们分别存储在 str1
, str2
, str3
中。注意这里使用了 %s
格式说明符。
1.2、使用循环读取
如果需要处理不定数量的字符串,可以使用循环来读取输入:
#include <stdio.h>
int main() {
int n;
printf("Enter the number of strings: ");
scanf("%d", &n);
char strings[n][100];
for(int i = 0; i < n; i++) {
printf("Enter string %d: ", i + 1);
scanf("%s", strings[i]);
}
printf("You entered:n");
for(int i = 0; i < n; i++) {
printf("%sn", strings[i]);
}
return 0;
}
在这个例子中,用户可以指定要输入的字符串数量,程序会动态地读取并存储这些字符串。
二、USING GETS/FGETS
gets
和 fgets
是用于读取整行输入的函数。相比 scanf
,它们能更好地处理包含空格的字符串。
2.1、使用 gets
gets 函数已被C11标准弃用,原因是它存在缓冲区溢出风险。尽管如此,为了完整性,还是介绍一下它的用法:
#include <stdio.h>
int main() {
char str1[100], str2[100], str3[100];
printf("Enter three strings:n");
gets(str1);
gets(str2);
gets(str3);
printf("You entered: %s, %s, %sn", str1, str2, str3);
return 0;
}
2.2、使用 fgets
fgets 是更安全的选择,它允许指定最大读取长度,从而避免缓冲区溢出:
#include <stdio.h>
int main() {
char str1[100], str2[100], str3[100];
printf("Enter three strings:n");
fgets(str1, 100, stdin);
fgets(str2, 100, stdin);
fgets(str3, 100, stdin);
printf("You entered: %s, %s, %sn", str1, str2, str3);
return 0;
}
fgets 读取的字符串会包含换行符,可以通过处理字符串去除换行符。
三、USING DYNAMIC MEMORY ALLOCATION
使用动态分配内存的方法可以更灵活地处理字符数组,特别是在不知道输入字符串的长度时。
3.1、基本用法
通过使用 malloc
或 calloc
动态分配内存,可以在运行时确定字符串的长度:
#include <stdio.h>
#include <stdlib.h>
int main() {
int n;
printf("Enter the number of strings: ");
scanf("%d", &n);
char strings = (char )malloc(n * sizeof(char *));
for(int i = 0; i < n; i++) {
strings[i] = (char *)malloc(100 * sizeof(char));
printf("Enter string %d: ", i + 1);
scanf("%s", strings[i]);
}
printf("You entered:n");
for(int i = 0; i < n; i++) {
printf("%sn", strings[i]);
free(strings[i]); // 释放每个字符串的内存
}
free(strings); // 释放字符串指针数组的内存
return 0;
}
3.2、使用 fgets 动态读取
结合 fgets
和动态内存分配,可以处理不定长度且包含空格的字符串:
#include <stdio.h>
#include <stdlib.h>
int main() {
int n;
printf("Enter the number of strings: ");
scanf("%d", &n);
getchar(); // 消耗掉换行符
char strings = (char )malloc(n * sizeof(char *));
for(int i = 0; i < n; i++) {
strings[i] = (char *)malloc(100 * sizeof(char));
printf("Enter string %d: ", i + 1);
fgets(strings[i], 100, stdin);
// 去除换行符
size_t len = strlen(strings[i]);
if(len > 0 && strings[i][len - 1] == 'n') {
strings[i][len - 1] = '