根据条件将元素添加到两个数组

时间:2017-08-05 09:43:17

标签: c arrays

有一个数组x,我想根据if条件将其元素放在数组y和z中。

    int x[10],y[5],z[5];
    for(for x array)
      if(some condition)
         {
             //put in y
        }
       else   {
             //put in z
             }

我无法弄清楚的是如何在分配元素时跟踪数组y和z中的索引。任何帮助/建议表示赞赏。揍你。

3 个答案:

答案 0 :(得分:1)

在处理任何数组时,C不提供任何边界检查,这个责任完全由你作为C程序员。尝试访问定义的数组边界之外的元素会调用未定义的行为

为防止偏离未定义的行为,请始终跟踪当前数组索引(填充时)并针对 Max 数组索引进行测试。虽然您可以使用sizeof array / sizeof *array注意只在声明数组的范围内有效 。一旦数组作为参数传递给函数,第一级间接是转换为指针sizeof此后将返回sizeof (a pointer)而不是数组大小。

请勿在代码中使用幻数。如果您的代码中需要常量,请在代码顶部定义它们,例如: #define XMAX 10,或使用enum来声明它们。这样,如果您需要更改边界(或者任何常量用于),您在顶部只有一个位置,并且您不必每次循环或有条件地选择一些< em>幻数 in。

在您的案例中将x中的奇数/偶数分隔为y&amp; z可以通过以下方式完成:

#include <stdio.h>

enum { YZMAX = 5, XMAX = 10 };

int main (void) {

    int x[XMAX]  = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
        y[YZMAX] = {0},
        z[YZMAX] = {0};
    size_t yndx = 0, zndx = 0;

    for (int i = 0; i < XMAX; i++)
        if (yndx < YZMAX && (x[i] & 1) == 0) {
            y[yndx++] = x[i];
        }
        else if (zndx < YZMAX) {
            z[zndx++] = x[i];
        }

    for (int i = 0; i < YZMAX; i++)
        printf (" y[%d] : %d        z[%d] : %d\n", i, y[i], i, z[i]);

    return 0;
}

示例使用/输出

$ ./bin/xyzindex
 y[0] : 0        z[0] : 1
 y[1] : 2        z[1] : 3
 y[2] : 4        z[2] : 5
 y[3] : 6        z[3] : 7
 y[4] : 8        z[4] : 9

从命令行参数中读取2D数组

无论您是在阅读一维数组还是二维数组,过程都是一样的。唯一改变的是跟上一个额外的索引。在您的注释中,您提供了在单个命令行参数字符串中包含多个整数的附加转折。虽然一开始可能会让人感到困惑,但如果你想一想,它与从文件中的单行文本中读取多个整数没有什么不同。

虽然您建议使用"2 4""3 5"这两个参数,但没有理由担心每个参数中有多少个整数。处理"2 4 3""5"的工作方式相同(或"2 4 3 5"2 4 3 5

注意:您通常不希望提供数组值作为命令行参数(您可以,但......)您通常希望从中读取值文件(或stdin - 一个文件)。命令行参数通常用于影响代码行为(例如,--help等)或提供可以从中读取值的文件名,而不是提供值本身。它取决于你。 (对于简单的测试代码,可以根据需要使用参数)

关键是读取每个整数(无论它来自哪个参数)更新行/列索引,并在返回读取下一个整数之前采取所需的任何其他步骤。例如:

#include <stdio.h>

#define ROW 2
#define COL 2
#define BASE 10

int main (int argc, char **argv) {

    if (argc < 2) {         /* validate at least one argument string given */
        fprintf (stderr, "error: insufficient input.\n"
                        "usage: %s [followed by %d integers]\n",
                        argv[0], ROW + COL);
        return 1;
    }

    int arr[ROW][COL] = {{0}},      /* array */
        row = 0, col = 0,           /* row / col indexes */
        ndx = 1;                    /* argument index */

    /* loop over each argument until array filled. 
     * you don't know how many integers could be
     * in each argument., e.g. ("2 4" and "3 5")
     */
    while (ndx < argc) {
        char *p = argv[ndx];            /* pointer to current argument */
        int offset = 0, tmp;

        /* convert each int in argument and get offset in arg for next */
        while (sscanf (p, "%d%n", &tmp, &offset) == 1) 
        {
            arr[row][col++] = tmp;      /* assign value to element */

            if (col == COL)             /* test if column full */
                row++, col = 0;         /* increment row, zero column */

            if (row == ROW)             /* test if array full */
                goto done;              /* goto required to break 2 loops */

            p += offset;                /* increment p by offset */
        }
        ndx++;                          /* process next argument */
    }
    done:;

    for (int i = 0; i < ROW; i++) {                     /* for each row */
        for (int j = 0; j < COL; j++)                   /* for each col */
            printf (" %2d", arr[i][j]);
        putchar ('\n');
    }

    return 0;
}

示例使用/输出

$ ./bin/array_2d_args "2 4" "3 5"
  2  4
  3  5

$ ./bin/array_2d_args "2 4 3" "5"
  2  4
  3  5

$ ./bin/array_2d_args "2 4 3 5"
  2  4
  3  5

$ ./bin/array_2d_args 2 4 3 5
  2  4
  3  5

从文件中读取将以相同的方式工作。您只需使用fgets循环读取读取的行,而不是循环遍历参数,只需处理使用sscanf读取的每行文本中的整数,或使用fscanf处理单个值的读取和转换

注意:将strtol用于转换为整数而不是sscanf是有好处的,因为它提供了更多错误处理信息,但也需要一些额外的代码,用于执行错误检查。

从文件或stdin

中读取值

如上所述,在许多情况下,直接从文件中读取而不是使用命令行参数实际上更容易。这是一个简短的例子。在这种情况下,不是读取整数然后处理索引,我们使用两个循环来将读取的整数数量限制为循环执行的次数。无论哪种方式都可以:

#include <stdio.h>

#define ROW 2
#define COL 2

int main (int argc, char **argv) {

    int arr[ROW][COL] = {{0}};

    /* open filename given by argv[1] (or use stdin as default) */
    FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;

    if (!fp) {  /* validate file open for reading */
        fprintf (stderr, "error: file open failed '%s'.\n", argv[1]);
        return 1;
    }

    for (int i = 0; i < ROW; i++)                       /* for each row */
        for (int j = 0; j < COL; j++)                   /* for each col */
            if (fscanf (fp, "%d", &arr[i][j]) != 1) {   /* read element */
                /* handle error */
                fprintf (stderr, "error: invalid input arr[%d][%d].\n", i, j);
                return 1;
            }

    if (fp != stdin) fclose (fp);     /* close file if not stdin */

    for (int i = 0; i < ROW; i++) {                     /* for each row */
        for (int j = 0; j < COL; j++)                   /* for each col */
            printf (" %2d", arr[i][j]);
        putchar ('\n');
    }

    return 0;
}

示例输入文件

$ cat dat/2x2.txt
2 4
3 5

示例使用/输出

$ ./bin/array_2d_file <dat/2x2.txt
  2  4
  3  5

注意:输入不需要行或列,因为您使用fscanf一次读取一个整数 - 和 - {{1}在阅读下一个数字之前,格式说明符将跳过所有前导空格(包括"%d")。因此输入可以是单行或4行,例如

全部在一条线上:

'\n'

或多行混合

$ echo "2 4 3 5"
2 4 3 5

$ echo "2 4 3 5" | ./bin/array_2d_file
  2  4
  3  5

$ printf "2\n4\n3\n\n5\n"
2
4
3

5

$ printf "2\n4\n3\n\n5\n" | ./bin/array_2d_file
  2  4
  3  5

在所有答案中仔细查看,如果您有其他问题,请告诉我。

答案 1 :(得分:0)

对于静态定义的数组;

int x[10],y[5],z[5];
for(for x array)
  if(some condition)
  {
         //yindex is the index of the y array where you are going to assign the value
         if(yindex < sizeof(y) / sizeof(y[0]))
         {
            y[yindex] = value;
         }
  }

答案 2 :(得分:-1)

you can give like that condition if you will initialize at least one array (y or z) with 0, maybe it will be helpful for you. Example:

#include<stdio.h>

int main()
{
    //put values in x array otherwise it will take by default garbage value.
    int i, j, k, x[10], y[5]={0}, z[5]; 
    for(i=0; i<10; i++)
    {
        scanf("%d",&x[i]); //for console input.
    }
    for(i=0, j=0, k=0; i<10; i++)
    {
        if(y[j]==0 && j<5)  //if(y[j]==0)
        {
            //put in y
            y[j]=x[i];
            printf("%d ",y[j]);
            j++;
        } else {
            //put in z
            z[k]=x[i];
            printf("%d ",z[k]);
            k++;
        }
    }
}

when you assign size only like x[10] without assigning any elements in C then it will store garbage values in array so if you want to store one array to another array then have to give condition for if() whatever you want to do.