面试题答案
一键面试#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 函数声明
void inputStrings(char **strings, int n);
void outputStrings(char **strings, int n);
void freeStrings(char **strings, int n);
int main() {
int n;
printf("请输入行数: ");
scanf("%d", &n);
// 动态分配二维数组的指针数组
char **strings = (char **)malloc(n * sizeof(char *));
if (strings == NULL) {
printf("内存分配失败\n");
return 1;
}
inputStrings(strings, n);
printf("输入的字符串如下:\n");
outputStrings(strings, n);
freeStrings(strings, n);
return 0;
}
// 输入字符串
void inputStrings(char **strings, int n) {
for (int i = 0; i < n; i++) {
int length;
printf("请输入第 %d 行字符串的长度: ", i + 1);
scanf("%d", &length);
// 动态分配每一行的内存
strings[i] = (char *)malloc((length + 1) * sizeof(char));
if (strings[i] == NULL) {
printf("内存分配失败\n");
// 释放之前分配的内存
for (int j = 0; j < i; j++) {
free(strings[j]);
}
free(strings);
exit(1);
}
printf("请输入第 %d 行字符串: ", i + 1);
scanf("%s", strings[i]);
}
}
// 输出字符串
void outputStrings(char **strings, int n) {
for (int i = 0; i < n; i++) {
printf("第 %d 行字符串: %s\n", i + 1, strings[i]);
}
}
// 释放内存
void freeStrings(char **strings, int n) {
for (int i = 0; i < n; i++) {
free(strings[i]);
}
free(strings);
}
关键步骤注释:
main
函数:- 首先获取用户输入的行数
n
。 - 然后动态分配一个指针数组
strings
,用于存储指向每一行字符串的指针。 - 调用
inputStrings
函数输入字符串,outputStrings
函数输出字符串,最后调用freeStrings
函数释放内存。
- 首先获取用户输入的行数
inputStrings
函数:- 遍历每一行,获取用户输入的该行字符串长度
length
。 - 为每一行动态分配内存,大小为
length + 1
(包含字符串结束符'\0'
)。 - 如果内存分配失败,释放之前分配的内存并退出程序。
- 获取用户输入的该行字符串。
- 遍历每一行,获取用户输入的该行字符串长度
outputStrings
函数:- 遍历每一行并输出字符串。
freeStrings
函数:- 遍历每一行释放每一行分配的内存,最后释放存储指针的数组
strings
。
- 遍历每一行释放每一行分配的内存,最后释放存储指针的数组