【问题标题】:C string array, assigning and passing etcC字符串数组,分配和传递等
【发布时间】:2018-05-01 15:15:29
【问题描述】:

我一直在重新思考我的提问方式。所以我编辑了这个问题。

我事先知道数组中有多少个字符串,因为它是菜单文本。 假设我有一个声明为这样的字符串数组:char *menu_item[4]; 这应该给我一个可以容纳 4 个字符串的数组吧?

我希望能够将字符串数组传递给其他函数,这是这样做的方法吗?

这个数组没有在 main 中声明。但在从 main 调用的函数中。

  1. 我是否必须分配内存才能使用 fx strcpy(menu_item[1],"some text"); 如果是的话。我应该分配什么? 还是menu_item[0] = "some text"okay??

  2. 我在函数中有一个函数可以打印出以char *string 作为参数的字符串。并且函数本身需要一个字符串数组,所以char *items[] 看起来像这样:

    void scroll_menu(char *items[], int size){
        for(int i = 0; i < size; i++){
            print_out(items[i]);
        }    
    }
    

    字符串数组的参数是否正确?

我一直在网上查看很多问题。并且似乎找不到任何可以解决我的问题的方法。

如果有任何疑问,我会回顾一下我想要什么:

  1. 我想声明一个包含已知数量字符串的字符串数组。有时可以在数组的声明中初始化字符串。有时我必须在某个地方查找,然后“分配”或将结果复制到数组中。
  2. 我希望能够从返回char *string 的函数中复制或分配字符串,就像strcpy(menu_item[0], some_function_returning_string());

我的问题是我尝试了很多不同的东西,以至于我感到困惑。并误解了字符串数组的操作。

我也试过char menu_items[4][20]; 然后strcpy(menu_items[0], "some text"); 没有任何运气。然后是如何使函数接受这样声明的数组的问题。

关于如何完成我想要的任何建议都会非常好。

编辑

我花了一些时间阅读 c 编程书籍并找到了我想要的东西。 如果我声明一个指向字符串的指针数组 char *menu_items[4] 我将有一个数组,可以接受 4 个指向字符串或字符数组的指针 char *string

如果我想从返回 char * 的函数中分配一个字符串,我有一个函数:

char *function_returning_string(int x){
    static char *strings[3] = {"this","is","strings"};

    if(x <= 2){
        return strings[0];
    }
    else if(x > 2){
        return string[1];
    }
    else{
        return strings[2];
    }
}

我调用此函数的代码如下:

static char *other_strings = {"yes", "no"};

char *menu_item[3];

menu_item[0] = "ok";
menu_item[1] = other_strings[0];
menu_item[2] = function_returning_string(3);

然后我可以将整个字符串数组传递给以*string_array[] 作为参数的函数,就像function_takin_string_array(menu_item); 或内部的任何字符串到以char *string 作为参数的函数,这样function_taking_string(menu_item[2]);

代码编译没有错误并且可以工作。如果有人认为代码有问题或有误解,请告诉我。

【问题讨论】:

  • 这里有很多错误。尝试使用调试器并自己检查问题所在。
  • static char *addr; sprintf(addr, "S %d", i + 1); return addr; 几个问题:1) 你在哪里为addr 分配内存。 2) 我只是想确保您了解static 在这种情况下的工作原理。
  • 我明白你的意思。这是因为我在某处读到了用 "" 引号返回一个字符串。它应该是静态的。我想我还没有更正。但我一直在盲目地盯着几个小时。所以感谢您指出这个问题。而且没有分配指针。

标签: c


【解决方案1】:

正如 MFisherKDX 指出的这部分代码不正确:

 static char *addr;
 sprintf(addr, "S %d", i + 1);
 return addr;

你觉得你在这里返回什么?它应该在 sprintf() 调用中失败,因为您尝试为未分配的内存分配一些值。应该是这样的:

static char addr[128];
sprintf(addr, "S %d", i + 1);
return addr;

以及上面提到的 PeterJ_01 如何尝试使用 gdb 找出问题所在以及您还有其他错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-23
    • 2010-12-15
    • 2011-10-08
    • 2022-08-22
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多