将ARGV []存储到两个阵列中,除以一个特殊的字符串(C)



我想读取命令行中的参数并将其存储到两个数组中。阵列之间的分离将以"切割"表示。

示例:A.out Andy Bob Charlie Ned Cut Amy Sophie Anna

array1将为{安迪,鲍勃,查理,ned}

array2将为{艾米,索菲,安娜}

我找到了"剪切"一词的argc。然后,我将一个循环从0到该索引的第一个数组。我在第二个数组中遇到麻烦。

int cutindex, i;
for(i=1; i<argc; i++) {
  if(strcmp("cut", argv[i]) == 0){
    cutindex = i;
  }
}
char argv1[10];
for(i=0; i<cutindex-1; i++) {
  argv1[i] = argv[i+1];
}
char argv2[10];
for(i=0; i<argc-cutindex-1; i++) {
  argv2[i] = argv[cutindex+1];
}

对于第二个数组,我将重复整个数组的第一个值(AMY(。我在做什么错?

首先,是否有更好的(更有效(的方法?

评论中指出了一些问题:

  1. 在第三个循环中,该代码使用cutindex + 1argv数组索引。但是循环不会更改 cutindex,因此在整个数组中重复" cut"(示例中的"艾米"(之后的第一个参数。

  2. 输出数组argv1argv2应该是指针的数组。

第一个问题的一种解决方案是为每个数组使用单独的索引。这样,您可以根据需要增加每个索引,也无需尝试以数学计算进行计算。

附加的好处是,当代码完成后,每个输出索引的最终值是相应输出数组中元素的计数。

另一个附加的好处是,您可以限制写入数组的元素数量。请注意,在下面的代码中,前10个之后的任何参数都会默默删除。在实际代码中,您可能需要提醒用户他们输入了太多参数。

#include <stdio.h>
#include <string.h>
#define MAX_ARG 10
int main(int argc, char *argv[])
{
    char *argv1[MAX_ARG];   // first array of arguments
    int n1 = 0;             // index into first array
    char *argv2[MAX_ARG];   // second array of arguments
    int n2 = 0;             // index into second array
    // copy pointers into the first array until "cut" is found
    int i;
    for (i = 1; i < argc; i++)
    {
        if (strcmp("cut", argv[i]) == 0)
            break;
        if (n1 < MAX_ARG)
            argv1[n1++] = argv[i];
    }
    // copy any remaining pointers into the second array
    for (i++; i < argc; i++)
    {
        if (n2 < MAX_ARG)
            argv2[n2++] = argv[i];
    }
    // print the arrays
    for (int i = 0; i < n1; i++)
        printf("argv1[%d] = '%s'n", i, argv1[i]);
    putchar('n');
    for (int i = 0; i < n2; i++)
        printf("argv2[%d] = '%s'n", i, argv2[i]);
}

使用命令行运行

./a.out andy bob charlie ned cut amy sophie anna

此代码的输出是

argv1[0] = 'andy'
argv1[1] = 'bob'
argv1[2] = 'charlie'
argv1[3] = 'ned'
argv2[0] = 'amy'
argv2[1] = 'sophie'
argv2[2] = 'anna'

相关内容

最新更新