如何获取存储在数组中的字符串长度(C)

k t*_*k t 2 c

  1. 我将如何获得下面字符串的长度以及数组大小?

    字符 str [] = {};

        str[0] = "He";
        str[1] = "llo";
        str[2] =  " Wor";
        str[3] ="ld";
    
    Run Code Online (Sandbox Code Playgroud)

  2. 我如何将它们存储在多维数组中?所以这个数组看起来像这样:

    char strstr [str的大小][str的字符串长度];

所述 strstr[][]阵列的尺寸应
的数组元素的1.number STR
在所有字符的2.number STR。在 的情况下 strstr[3][1],这将是“ d ”。
如果不首先初始化str数组,这可能吗?


[编辑] 我明白了,的第二维strstr没有意义。它应该是 [/edit]中每个元素的长度,*str而不是完整的字符数*str

jke*_*ian 5

这可能会做你想要的,但这并不是你所要求的。

#include <stdio.h>

char *strs[] = {
    "foo",
    "bar",
    "bazy"
};

int main() {
    printf("%d - %s\n", strlen(strs[0]), strs[0]);
    printf("%d - %s\n", strlen(strs[1]), strs[1]);
    printf("%d - %s\n", strlen(strs[2]), strs[2]);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出

3 - foo
3 - bar
4 - bazy
Run Code Online (Sandbox Code Playgroud)

请注意,您只有几种存储数组的可能性。您可以执行此解决方案所做的操作(创建指向数组的指针数组),在大数组中创建一个“压缩”数组列表,或者创建一个过大的二维数组。


“压缩”数组将采用以下格式:

char strs[] = "foo\0bar\0bazy"; // array is {f,o,o,\0,b,a,r,\0,b,a,z,y,\0}
Run Code Online (Sandbox Code Playgroud)

这种格式的问题在于访问第一个元素之后的任何内容都有些棘手,并且通常涉及在数组中线性搜索。(或保留一个单独的地址表......就像第一个解决方案一样)


二维数组要求您指定所有大小,如下所示:

char strs[3][5] = {
   "foo",
   "baz",
   "baxy"
};

int main() {
    printf("%d - %s\n", strlen(strs[0]), strs[0]);
    printf("%d - %s\n", strlen(strs[1]), strs[1]);
    printf("%d - %s\n", strlen(strs[2]), strs[2]);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这可能在内存中是这样排列的:

{f,o,o,\0,*,b,a,z,\0,*,b,a,x,y,\0} (the *'s could be anything, most dependent on your compiler)
Run Code Online (Sandbox Code Playgroud)

由于编译器知道每个字符串恰好占用 5 个字节,因此它可以轻松计算后面元素的位置。