arrays - 数组数组
问题描述
我想在一个数组中存储一组包含 2 个数字的数组。但我只希望在 5 后跟逗号并输入另一个数字时存储 2 个数字。本质上,我希望我的程序做的是从这个数组中读取并相应地执行任务。因此,如果用户输入 2,我想将 (2,0) 存储在我的数组的一个空间中,然后继续向我的用户询问第二个数字。但是,如果用户键入 5,10,我希望程序将 (5,10) 存储在同一个数组中。然后我的程序可以过滤哪个数组只有一个值,哪个有 2 并相应地执行不同的任务。我的任务要求我们不要为每个数组询问 2 个数字,这样会更容易。
这是我到目前为止所拥有的,我知道我错了,我只是不知道从哪里开始:
int main(void)
{
int size = 0;
int input;
int factor;
int mdArrays[100][2];
for (size_t i = 0; i < 100; i++)
{
size = i;
scanf("%d,%d", &input, &factor);
if (input != 5 && input != 9)
{
factor = 0;
for (size_t j =0 ; j< 2; j++)
{
mdArrays[i] = input;
mdArrays[j] = factor;
}
}
else if (input == 9)
{
break;
}
else
{
for(int j = 0; j< 2; j++)
{
mdArrays[i] = input;
mdArrays[j] = factor;
}
}
}
for (size_t i =0; i < size; i++)
{
for(size_t j = 0; j < 2; j++)
{
printf("%d,%d", mdArrays[i[j]]);
}
}
}
解决方案
有几个问题。
size
是一个太短(应该是i + 1
)。
可能可以处理5
vs5,23
使用scanf
. 但是,我更喜欢使用fgets
andstrtol
并检查分隔符(例如是否,
存在)。
如果我们进行第一次测试以停止循环,if/else
则可以简化梯形逻辑。input == 9
根据您的代码,您想强制 afactor
为零if input != 5
。这对我来说没有多大意义,但我[暂时]保留了这个逻辑。
这可能不是您想要/需要的,但这是我对您的代码的最佳解释。主要目的是区分给定行上有多少个数字。因此,根据需要调整其余部分。
我认为您存储/显示数组的方式不正确。我相信你想存储input
intomdArrays[i][0]
和factor
into mdArrays[i][1]
。使用j
对我来说毫无意义。
正如我提到的[在我的顶级评论中],printf
最终循环中的 in 无效。
请注意,如果我们不在多个位置(例如,一次在声明中,一次在外循环中)用文字 硬连接尺寸,代码会更简洁。更好地使用(例如)并用(见下文)替换其他地方。100
myArrays
for
#define MAXCOUNT 100
100
MAXCOUNT
我创建了三个版本。一个用原始和固定代码注释的。另一个删除原始代码。并且,第三个使用struct
.
这是重构的代码。我已将您的/旧代码括起来 [vs. 我/新代码] 与:
#if 0
// old code
#else
// new code
#endif
我添加了一个调试printf
。无论如何,这是带有一些注释的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int
main(void)
{
int size = 0;
int input;
int factor;
int mdArrays[100][2];
for (size_t i = 0; i < 100; i++) {
#if 0
size = i;
scanf("%d,%d",&input,&factor);
#else
// get line
char buf[100];
char *cp = fgets(buf,sizeof(buf),stdin);
if (cp == NULL)
break;
// strip newline -- only needed for debug print
cp = strchr(buf,'\n');
if (cp != NULL)
*cp = 0;
// decode first number
input = strtol(buf,&cp,10);
// decode second number if it exists -- otherwise, use a sentinel
if (*cp == ',')
factor = strtol(cp + 1,&cp,10);
else
factor = -1;
printf("DEBUG: buf='%s' input=%d factor=%d\n",buf,input,factor);
#endif
// stop input if we see the end marker
if (input == 9)
break;
// remember number of array elements
size = i + 1;
// only use a non-zero factor if input is _not_ 5
if (input != 5) {
factor = 0;
#if 0
for (size_t j = 0; j < 2; j++) {
mdArrays[i] = input;
mdArrays[j] = factor;
}
continue;
#endif
}
#if 0
for (int j = 0; j < 2; j++) {
mdArrays[i] = input;
mdArrays[j] = factor;
}
#else
mdArrays[i][0] = input;
mdArrays[i][1] = factor;
#endif
}
for (size_t i = 0; i < size; i++) {
#if 0
for (size_t j = 0; j < 2; j++) {
printf("%d,%d",mdArrays[i[j]]);
}
#else
printf("%d,%d\n",mdArrays[i][0],mdArrays[i][1]);
#endif
}
return 0;
}
这是我用来测试的示例输入:
5,3
7,6
8,9
5,37
5
9,23
这是程序输出:
DEBUG: buf='5,3' input=5 factor=3
DEBUG: buf='7,6' input=7 factor=6
DEBUG: buf='8,9' input=8 factor=9
DEBUG: buf='5,37' input=5 factor=37
DEBUG: buf='5' input=5 factor=-1
DEBUG: buf='9,23' input=9 factor=23
5,3
7,0
8,0
5,37
5,-1
这是一个稍微清理过的版本:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXCOUNT 100
int
main(void)
{
int size = 0;
int input;
int factor;
int mdArrays[MAXCOUNT][2];
for (size_t i = 0; i < MAXCOUNT; i++) {
// get line
char buf[100];
char *cp = fgets(buf,sizeof(buf),stdin);
if (cp == NULL)
break;
// strip newline -- only needed for debug print
#ifdef DEBUG
cp = strchr(buf,'\n');
if (cp != NULL)
*cp = 0;
#endif
// decode first number
input = strtol(buf,&cp,10);
// decode second number if it exists -- otherwise, use a sentinel
if (*cp == ',')
factor = strtol(cp + 1,&cp,10);
else
factor = -1;
#ifdef DEBUG
printf("DEBUG: buf='%s' input=%d factor=%d\n",buf,input,factor);
#endif
// stop input if we see the end marker
if (input == 9)
break;
// remember number of array elements
size = i + 1;
// only use a non-zero factor if input is _not_ 5
if (input != 5)
factor = 0;
mdArrays[i][0] = input;
mdArrays[i][1] = factor;
}
for (size_t i = 0; i < size; i++)
printf("%d,%d\n",mdArrays[i][0],mdArrays[i][1]);
return 0;
}
您可能会从使用struct
[YMMV] 中受益,所以这里有一个以这种方式组织事物的版本:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXCOUNT 100
typedef struct {
int input;
int factor;
} data_t;
int
main(void)
{
int size = 0;
data_t mdArrays[MAXCOUNT];
data_t *data;
for (size_t i = 0; i < MAXCOUNT; i++) {
// get line
char buf[100];
char *cp = fgets(buf,sizeof(buf),stdin);
if (cp == NULL)
break;
// strip newline -- only needed for debug print
#ifdef DEBUG
cp = strchr(buf,'\n');
if (cp != NULL)
*cp = 0;
#endif
data = &mdArrays[i];
// decode first number
data->input = strtol(buf,&cp,10);
// decode second number if it exists -- otherwise, use a sentinel
if (*cp == ',')
data->factor = strtol(cp + 1,&cp,10);
else
data->factor = -1;
#ifdef DEBUG
printf("DEBUG: buf='%s' input=%d factor=%d\n",buf,input,factor);
#endif
// stop input if we see the end marker
if (data->input == 9)
break;
// remember number of array elements
size = i + 1;
// only use a non-zero factor if input is _not_ 5
if (data->input != 5)
data->factor = 0;
}
for (size_t i = 0; i < size; i++) {
data = &mdArrays[i];
printf("%d,%d\n",data->input,data->factor);
}
return 0;
}
推荐阅读
- python - 如何让你的玩家通过pygame的第一关
- c++ - 有人可以向我解释链接列表和链接包之间有什么区别吗?
- css - CSS不是选择器问题
- c# - Xamarin C# - INotifyPropertyChanged 模型 - JSON 反序列化错误
- python - 将 2D numpy 数组转换为 STL 文件
- setup.py - 是否可以在 wheel/bdist/sdist 中包含 Python 包之外的文件?
- amazon-web-services - gulp-awspublish 使用 AWS 配置文件而不是 AWS_ACCESS_KEY 和秘密
- html - 将整个页面缩小为一个 div
- c# - 如何检查是否在 KeyUp 事件的文本框中输入了数字或字母
- flutter - 设备锁定时颤动动画侦听器不起作用