C++按行读入数组【数组元素均一行/多行输入】

C++按行读入数组【数组元素均一行/多行输入】

0 - 前言

今天做了阿里的笔试题,其中一道的部分要求是:按行读入一个数组

输入示例

4 7 12 13

鉴于之前在力扣刷题,题目的示例输入多是在函数入口处定义好的,所以基本没接触过需要自己cin的题目,突然卡住了,基础不牢,地动山摇

1 - 静态数组

#include <iostream>
using namespace std;
int main() {
    int n = 0;
    cin >> n;
    int a[1000];
    for (int i=0; i<n; i++) {
        cin>>a[i];
    }
}

因为Cpp在创建基本类型数组(int、char、double)时,不能使用变量来规定数组界限,所以静态数组往往治标不治本,只能适用于有一定大小的数据输入要求。

使用静态数组的坏处:编译时直接创建大小固定的数组,容易浪费空间;再一个数组越界时不容易察觉;最后,不能在函数内创建,因为函数不能返回基本类型数组,只能返回首元素地址,有点麻烦

2 - 动态数组

#include <iostream>
#include <vector>
using namespace std;

vector<int> dynamicArray() {
    int n = 0;
    cin >> n;
    vector<int> a(n);
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }
    return a;
}

int main() {
    //输入数组元素时,回车与空格相同
    vector<int> a = dynamicArray();

    return 0;
}

动态数组的优点就是静态数组的缺点改正以后:

1、运行时创建,不必事先规定大小

2、数组越界会被debug到

3、可以作为函数返回值

3 - cin与空格、回车

实际上,cin在遇到空格、回车时,都会认为当前输入已经结束,自动切换到下一输入。因此,使用cin填充输入时,空格与回车作用相同。请看示例:

for (int i = 0; i < 3; i++) {
	cin >> a[i];
}
//输入方式1:
1
2
3
//输入方式2:
1 2 3
//输入方式3:
1
2 3

以上三种输入方式,效果都是一样的,最终,a = {1, 2, 3}

参考:

C++在同一行输入多个整数(用空格分开)储存到一个数组中(+一道笔试题)

c++在数组定义时长度是否可以使用变量
C++问题!cin能读取回车和空格字符吗?

### 回答1: 在 C 语言中,可以使用以下方法来连续输入多行以,为区分的数据,并使用二维数组来储存数据: 1. 首先,你需要定义一个二维数组,用来储存输入的数据。例如: ``` int data[MAX_ROW][MAX_COL]; ``` 其中 `MAX_ROW` 和 `MAX_COL` 分别表示这个二维数组的行数和列数。 2. 然后,你可以使用循环来读入多行数据。例如: ``` for (int i = 0; i < MAX_ROW; i++) { // 读入第 i 行的数据 scanf("%d,%d,%d,...", &data[i][0], &data[i][1], &data[i][2], ...); } ``` 这里的 `scanf` 函数可以用来从标准输入读入数据。其中,第一个参数是格式字符串,表示你希望从输入读入的数据类型。第二个及以后的参数是地址,表示读入的数据将会存储到哪里。 3. 在循环内部,你可以使用一个循环来处理每一行的数据。例如: ``` for (int i = 0; i < MAX_ROW; i++) { // 读入第 i 行的数据 scanf("%d,%d,%d,...", &data[i][0], &data[i][1], &data[i][2], ...); // 处理第 i 行的数据 for (int j = 0; j < MAX_COL; j++) { // 在这里处理 data[i][j] } } ``` 注意:这里的做法 ### 回答2: 在C语言中,可以使用循环结构和二维数组来连续输入多行以","为区分的数据,并将其存储到二维数组中。以下是一个示例代码: ```c #include <stdio.h> #define MAX_ROWS 10 #define MAX_COLUMNS 10 int main() { char inputData[MAX_ROWS][MAX_COLUMNS]; // 声明一个二维字符数组用于存储输入数据 int num_rows = 0; // 记录输入的行数 printf("请输入多行数据,以逗号分隔,最多可以输入%d行:\n", MAX_ROWS); // 使用循环进行多行输入 while(num_rows < MAX_ROWS) { char line[MAX_COLUMNS]; printf("请输入第%d行数据:", num_rows+1); fgets(line, sizeof(line), stdin); // 使用fgets函数获取一行输入数据 strtok(line, "\n"); // 去除行末的换行符 // 使用逗号对一行数据进行拆分,并存储到二维数组中 char* token = strtok(line, ","); int num_columns = 0; while (token != NULL) { strcpy(inputData[num_rows]+num_columns, token); token = strtok(NULL, ","); num_columns++; } num_rows++; } // 打印输入数据保存到的二维数组 printf("\n您输入数组为:\n"); for (int i = 0; i < num_rows; i++) { for (int j = 0; j < strlen(inputData[i]); j++) { printf("%c ", inputData[i][j]); } printf("\n"); } return 0; } ``` 在这个例子中,使用了`fgets()`函数来获取一行数据,因为`fgets()`函数会包含换行符,我们需要使用`strtok()`函数将其去除。然后使用`strtok()`函数以逗号为分隔符对一行数据进行拆分,并逐个存储到二维数组中。在打印输入数据时,使用了嵌套循环来逐个打印数组中的每个元素。 请注意,这里假设输入的数据不会超出二维数组的大小限制,如果输入的数据过多,可能会导致溢出。因此,在实际应用中,需要根据具体情况对输入进行合理的限制和错误处理。 ### 回答3: 在C语言中,可以使用循环结构和二维数组来实现连续输入多行以逗号为区分的数据,并存储到二维数组中。 首先,我们可以定义一个二维数组来存储输入的数据,例如int arr[MAX_ROWS][MAX_COLS],其中MAX_ROWS和MAX_COLS分别代表二维数组的行数和列数。 然后,我们可以使用循环结构来实现连续输入多行数据。假设每行数据中的元素个数是相同的,可以使用for循环来分别读取每行数据并存储到二维数组中。 具体实现步骤如下: 1. 定义一个变量rows来表示已经输入的行数,初始值为0。 2. 使用循环结构,例如while循环或do-while循环,不断接收用户输入的数据,直到用户输入结束。 3. 在循环内部,首先定义一个字符串变量input来存储用户输入一行数据。 4. 使用scanf函数或fgets函数从标准输入中读取用户输入一行数据(以换行符为结束标志)。 5. 接着,可以使用字符串处理函数(如strtok函数)来将字符串input按照逗号进行拆分,得到各个元素。 6. 使用atoi函数或sscanf函数将拆分得到的每个元素转换为整数,并存储到二维数组中的对应位置,即arr[rows][列索引]。 7. 循环结束后,可以得到一个完整的二维数组,其中每一行是用户输入一行数据。 需要注意的是,上述实现仅适用于每行数据中元素个数相同的情况。如果输入的每行数据元素个数不同,可以使用动态内存分配来实现更灵活的存储方式。还应该注意对数组边界的检查,避免数组越界的错误。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值