C语言如何实现 输入一个正整数n 代表接下来要输入的n行正整数,每行的个数未知

在 C 语言中,可以实现一个程序,输入一个正整数 n,表示接下来要输入 n 行正整数,每行的个数未知。为了处理这种情况,可以使用动态内存分配来存储每行的数字,并逐行读取输入。以下是实现这一功能的详细步骤和代码示例。

1. 基本思路

  1. 读取行数 n:首先,读取要输入的行数。
  2. 动态分配内存:为每行的数字动态分配内存,以便根据实际输入调整大小。
  3. 读取每行数据:逐行读取输入的正整数,直到遇到换行符。
  4. 处理数据:根据需要处理或存储数据。
  5. 释放内存:程序结束时释放动态分配的内存。

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. 注意事项

  • 错误处理:检查 mallocrealloc 是否成功分配内存。
  • 输入验证:示例代码中没有处理非正整数输入和非整型输入,实际应用中应进行更严格的验证。
  • 内存泄漏:确保所有分配的内存都在程序结束前正确释放。

关键字

C, 动态内存分配, malloc, realloc, free, 输入处理, 二维数组, 逐行读取, 输入结束符, 内存管理