使用 fgets 将数据存储到数组中
Storing data with fgets into Arrays
我是一名刚接触编程的学生,所以如果我的问题可能被视为愚蠢且有点混乱,我深表歉意。所以我的问题是我必须创建一个程序,用户可以通过该程序插入一堆数字(我们使用 fgets),最后,他会打印出他之前输入的所有数字。现在,我实际上从老师那里得到了指导,但我不知道如何将数字存储在数组中,以便以后可以使用它们。我会留下老师提供的代码(我不是要别人给我做作业,我只是在找人向我解释代码的实际含义,以便我自己使用它)
我个人认为,有一些问题(但可能只是我了解的不多):
- 它看起来有点低效,尤其是因为我不能输入不允许的值(唯一允许的值在 0 到 100 之间),即使循环是 运行 我实际上可以,但它们只是被忽略。
- 例如,如果我插入 22 个数字,我将得到仅 21 个打印值的结果,因为第一个在检查它是否为允许值的过程中丢失了
我真的很困惑,但回到我原来的问题,如果可能的话,我想更好地理解这样的东西 array[variable]
是如何工作的,或者如果它可能的话。
非常感谢您。
#include <stdio.h>
#define MINNUM 18
#define MAXNUM 30
#define NNUM (MAXNUM - MINNUM + 1)
#define NMAX 100
int main() {
char s[80];
int n;
int nums[NMAX];
int i, num;
/* input */
fgets(s, sizeof(s), stdin);
n = atoi(s);
/* if n <= 0 print and error message and exit */
if (n <= 0 || n > NMAX) {
printf("[ERROR]\n");
return 0;
}
/* read only the allowed numbers */
i = 0;
do {
fgets(s, sizeof(s), stdin);
num = atoi(s);
/* save the number and increment 'i' only if the value is between 18 and 30 */
if (num >= MINNUM && num <= MAXNUM) {
nums[i] = num;
i++;
}
} while (i < n);
/* print */
printf("[NUMBERS]\n");
for (i = 0; i < n; i++)
printf("%d\n", nums[i]);
效率不低。代码有一些问题,但循环会继续,直到您输入所有必需的数字。这似乎是合乎逻辑的方法。主要问题是当你输入错误的数字时它应该给出错误,当你输入一个有效数字后跟一堆其他东西时,它只会忽略其他东西。
第一个不会迷路。第一个是您可以输入的值的数量。它被分配给变量 n
。循环一直运行,直到您输入了那么多数字 (while(i < n)
)
数组实际上只是同一类型值的序列。您使用元素访问运算符 ([]
) 来获取单个元素。在您的 array[variable]
示例中,variable
是 array
中的索引。这是如何工作的非常简单。 array
指的是一个内存地址,可以在该地址的指定偏移处访问一个元素;索引处的偏移量乘以元素的大小。
我是一名刚接触编程的学生,所以如果我的问题可能被视为愚蠢且有点混乱,我深表歉意。所以我的问题是我必须创建一个程序,用户可以通过该程序插入一堆数字(我们使用 fgets),最后,他会打印出他之前输入的所有数字。现在,我实际上从老师那里得到了指导,但我不知道如何将数字存储在数组中,以便以后可以使用它们。我会留下老师提供的代码(我不是要别人给我做作业,我只是在找人向我解释代码的实际含义,以便我自己使用它) 我个人认为,有一些问题(但可能只是我了解的不多):
- 它看起来有点低效,尤其是因为我不能输入不允许的值(唯一允许的值在 0 到 100 之间),即使循环是 运行 我实际上可以,但它们只是被忽略。
- 例如,如果我插入 22 个数字,我将得到仅 21 个打印值的结果,因为第一个在检查它是否为允许值的过程中丢失了
我真的很困惑,但回到我原来的问题,如果可能的话,我想更好地理解这样的东西 array[variable]
是如何工作的,或者如果它可能的话。
非常感谢您。
#include <stdio.h>
#define MINNUM 18
#define MAXNUM 30
#define NNUM (MAXNUM - MINNUM + 1)
#define NMAX 100
int main() {
char s[80];
int n;
int nums[NMAX];
int i, num;
/* input */
fgets(s, sizeof(s), stdin);
n = atoi(s);
/* if n <= 0 print and error message and exit */
if (n <= 0 || n > NMAX) {
printf("[ERROR]\n");
return 0;
}
/* read only the allowed numbers */
i = 0;
do {
fgets(s, sizeof(s), stdin);
num = atoi(s);
/* save the number and increment 'i' only if the value is between 18 and 30 */
if (num >= MINNUM && num <= MAXNUM) {
nums[i] = num;
i++;
}
} while (i < n);
/* print */
printf("[NUMBERS]\n");
for (i = 0; i < n; i++)
printf("%d\n", nums[i]);
效率不低。代码有一些问题,但循环会继续,直到您输入所有必需的数字。这似乎是合乎逻辑的方法。主要问题是当你输入错误的数字时它应该给出错误,当你输入一个有效数字后跟一堆其他东西时,它只会忽略其他东西。
第一个不会迷路。第一个是您可以输入的值的数量。它被分配给变量 n
。循环一直运行,直到您输入了那么多数字 (while(i < n)
)
数组实际上只是同一类型值的序列。您使用元素访问运算符 ([]
) 来获取单个元素。在您的 array[variable]
示例中,variable
是 array
中的索引。这是如何工作的非常简单。 array
指的是一个内存地址,可以在该地址的指定偏移处访问一个元素;索引处的偏移量乘以元素的大小。