【问题标题】:How to select an array of strings in C?如何在C中选择字符串数组?
【发布时间】:2013-06-20 20:55:16
【问题描述】:

我想在 C 中定义不同的字符串数组,然后可以是例如根据其他值选择,即如下所示:

char foo[][10] = {"Snakes", "on", "a", "Plane"};
char bar[][10] = {"Fishes", "in", "a", "Lake"};
char *choice;
if (flag == 1) {
  choice = &foo;
} else if (flag == 2) {
  choice = &bar;
} 
printf("%s%s\n", choice[0] , choice[1]); 

flag 为 1 时的预期结果:

毒蛇

flag 为 2 时的预期结果:

钓鱼

但上面的代码给出了segmentation fault 错误,而我尝试了char 的不同定义,即char*char**。怎么做才对?有没有关于这个问题的好教程,即关于指针,数组,上面的例子中foo到底是什么......

【问题讨论】:

  • 参见 printf 的手册页。您以非常错误的方式使用它!尝试 printf("%s%s\n",choice[0] ,choice[1]);
  • 编译时出现警告 (gcc: -Wall)
  • @Maneolin - 你是对的 - 我更新了代码。但是错误还是一样的(segmentation fault)。
  • 线程 stackoverflow.com/questions/2003745/… 应该对你有帮助。

标签: c arrays string pointers


【解决方案1】:

对于 char 数组,你需要这个:

char foo[][10] = {"Snakes", "on", "a", "Plane"};
char bar[][10] = {"Fishes", "in", "a", "Lake"};
char (*choice)[10];
if (flag == 1) {
    choice = &foo[0];
} else if (flag == 2) {
    choice = &bar[0];
} 
printf("%s%s\n", choice[0] , choice[1]); 

要让choice[1] 引用正确的槽,它必须是指向数组元素 类型的指针,并初始化为&foo[0] 而不是&foo。尽管它们是相同的地址,但它们是不同的数据类型。


如果您希望 choice 成为指向 2-dim char 数组的指针,可以这样做,但您在声明指针时指定了两个数组维度并记得取消引用它:

char foo[][10] = {"Snakes", "on", "a", "Plane"};
char bar[][10] = {"Fishes", "in", "a", "Lake"};
char (*choice)[4][10];
if (flag == 1) {
    choice = &foo;
} else if (flag == 2) {
    choice = &bar;
} 
printf("%s%s\n", *choice[0] , *choice[1]); 

【讨论】:

    【解决方案2】:

    如果你只使用指针数组会更容易:

    int main(void)
    {
      const char *foo[] = { "Snakes", "on", "a", "Plane" };
      const char *bar[] = { "Fishes", "in", "a", "Lake" };
      const int flag = 17;
      const char **choice = (flag == 1) ? foo : bar;
    
      printf("%s %s\n", choice[0], choice[1]);
    
      return 0;
    }
    

    以上印刷品

    Fishes in
    

    【讨论】:

    • 您的建议似乎有效!我会在实际代码中尝试一下。
    猜你喜欢
    • 2023-03-03
    • 2017-01-12
    • 2012-11-05
    • 1970-01-01
    • 2023-04-04
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多