首页 > 解决方案 > 数组数组

问题描述

我想在一个数组中存储一组包含 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]]);
        }
    }
}

标签: arrayscmultidimensional-array

解决方案


有几个问题。

size是一个太短(应该是i + 1)。

可能可以处理5vs5,23使用scanf. 但是,我更喜欢使用fgetsandstrtol并检查分隔符(例如是否,存在)。

如果我们进行第一次测试以停止循环,if/else则可以简化梯形逻辑。input == 9

根据您的代码,您想强制 afactor为零if input != 5。这对我来说没有多大意义,但我[暂时]保留了这个逻辑。

这可能不是您想要/需要的,但这是我对您的代码的最佳解释。主要目的是区分给定行上有多少个数字。因此,根据需要调整其余部分。

认为您存储/显示数组的方式不正确。我相信你想存储inputintomdArrays[i][0]factorinto mdArrays[i][1]。使用j对我来说毫无意义。

正如我提到的[在我的顶级评论中],printf最终循环中的 in 无效。

请注意,如果我们不在多个位置(例如,一次在声明中,一次在外循环中)用文字 硬连接尺寸,代码会更简洁。更好地使用(例如)并用(见下文)替换其他地方。100myArraysfor#define MAXCOUNT 100100MAXCOUNT

我创建了三个版本。一个用原始和固定代码注释的。另一个删除原始代码。并且,第三个使用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;
}

推荐阅读