C字符串数组,赋值和传递等

标签 c

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

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

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

该数组未在 main 中声明。但在从 main 调用的函数中。

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

  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 数组的指针的数组 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_take_string(menu_item[2]);

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

最佳答案

正如 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 来找出问题所在以及哪里还有其他错误。

关于C字符串数组,赋值和传递等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50119038/

相关文章:

c - 使用两个不同的状态同步两个进程

c - 如果在 Intel Skylake CPU 上作为函数调用,为什么我的空循环运行速度快两倍?

c - 如何为不断增加的文件连续生成名称?例如: book1. txt、book2.txt等

CodeWarrior 从 event.c 获取变量值

c - 将链接列表的链接列表保存到二进制文件

具有零大小数组成员的 C 结构体

c - 使用微 Controller 提取根

c - 矩阵分离素数和复合然后对它们进行排序

c - 如何检查C中不同函数的调用顺序

c - C 中的哪些对象声明导致存储被保留(即定义)?