C语言如何实现 输入一个正整数n 代表接下来要输入的n行正整数,每行的个数未知
在 C 语言中,可以实现一个程序,输入一个正整数 n
,表示接下来要输入 n
行正整数,每行的个数未知。为了处理这种情况,可以使用动态内存分配来存储每行的数字,并逐行读取输入。以下是实现这一功能的详细步骤和代码示例。
1. 基本思路
- 读取行数
n
:首先,读取要输入的行数。 - 动态分配内存:为每行的数字动态分配内存,以便根据实际输入调整大小。
- 读取每行数据:逐行读取输入的正整数,直到遇到换行符。
- 处理数据:根据需要处理或存储数据。
- 释放内存:程序结束时释放动态分配的内存。
2. 示例代码
下面是一个示例程序,展示了如何实现上述功能:
c#include <stdio.h>
#include <stdlib.h>
int main() {
int n, i;
// 读取行数
printf("Enter the number of lines: ");
scanf("%d", &n);
// 检查有效性
if (n <= 0) {
printf("The number of lines must be a positive integer.\n");
return 1;
}
// 动态分配内存
int **lines = (int **)malloc(n * sizeof(int *));
int *lengths = (int *)malloc(n * sizeof(int));
if (lines == NULL || lengths == NULL) {
printf("Memory allocation failed.\n");
return 1;
}
// 处理每行的输入
for (i = 0; i < n; i++) {
printf("Enter line %d (end with -1): ", i + 1);
int capacity = 10; // 初始容量
int count = 0; // 计数
lines[i] = (int *)malloc(capacity * sizeof(int));
if (lines[i] == NULL) {
printf("Memory allocation failed.\n");
return 1;
}
while (1) {
int num;
scanf("%d", &num);
if (num == -1) {
break; // 结束当前行的输入
}
// 检查是否需要扩展内存
if (count >= capacity) {
capacity *= 2;
lines[i] = (int *)realloc(lines[i], capacity * sizeof(int));
if (lines[i] == NULL) {
printf("Memory allocation failed.\n");
return 1;
}
}
// 存储数字
lines[i][count++] = num;
}
lengths[i] = count; // 保存当前行的长度
}
// 输出所有输入的数据
printf("\nYou entered:\n");
for (i = 0; i < n; i++) {
printf("Line %d: ", i + 1);
for (int j = 0; j < lengths[i]; j++) {
printf("%d ", lines[i][j]);
}
printf("\n");
}
// 释放内存
for (i = 0; i < n; i++) {
free(lines[i]);
}
free(lines);
free(lengths);
return 0;
}
3. 说明
- 动态内存分配:
malloc
用于分配内存。realloc
用于调整已分配内存的大小,以应对实际需要。free
用于释放内存,防止内存泄漏。
- 输入处理:
- 使用
-1
作为结束符标识每行输入的结束。 - 每行数据的数量可能不同,所以使用动态数组来存储。
- 使用
- 内存管理:
lines
是一个二维动态数组,存储每行的整数。lengths
数组记录每行的长度,以便后续输出使用。
4. 注意事项
- 错误处理:检查
malloc
和realloc
是否成功分配内存。 - 输入验证:示例代码中没有处理非正整数输入和非整型输入,实际应用中应进行更严格的验证。
- 内存泄漏:确保所有分配的内存都在程序结束前正确释放。
关键字
C, 动态内存分配, malloc
, realloc
, free
, 输入处理, 二维数组, 逐行读取, 输入结束符, 内存管理