【问题标题】:C Array of stringsC 字符串数组
【发布时间】:2011-06-06 10:11:31
【问题描述】:

我想创建一个字符串数组。问题是我希望能够静态访问每个字符串的长度。我试过这个:

char *a[] = {"foo", "foobar"};

除了我想静态知道每个元素的长度之外,该数组工作正常。 我不能使用sizeof(a[0]),因为它返回char * 指针的大小。我想要的是字符串大小的长度(a[0] 为 4,a[1] 为 7)。

有什么办法吗?

【问题讨论】:

  • 并行数组是否只是为了跟踪大小可以接受?

标签: c arrays string


【解决方案1】:

简而言之,不,不是在编译时(至少不是对于任意数量的字符串)。正如其他人所指出的那样,您可以执行各种类似运行时初始化的事情。正如其他人指出的那样,有固定数量的字符串的解决方案。

a[0] 的类型必须与a[1] 的类型相同(显然)。所以sizeof() 对于a[i] 的所有值必须评估为相同。

【讨论】:

    【解决方案2】:

    根据您对“字符串”的定义,a 不是字符串数组:它是指针数组(我将“字符串”定义为包含 N 个字符的数组,包括一个空终止符)。

    如果你想要一个长度和字符串数组(每个都可以容纳 999 个字符和空终止符),你可以这样做

    struct lenstring { size_t len; char data[1000]; };
    struct lenstring a[] = {
          { sizeof "foo" - 1, "foo" },
          { sizeof "foobar" - 1, "foobar" },
    };
    

    Example with simplifying macro running at ideone

    【讨论】:

      【解决方案3】:

      静态知道字符串长度的唯一安全方法是单独声明它们。

      char foo[] = "foo";
      char foobar[] = "foobar";
      
      char *a[] = {foo, foobar};
      

      您也许可以使用宏来消除一些繁琐的工作,具体取决于字符串的内容。不过,sizeof(a[0]) 仍将是 sizeof(char*)

      【讨论】:

      • 不确定是否可以使用宏。字符串"foo" 可以变成可用的标识符,但字符串"Hello, world!" 不能。
      【解决方案4】:

      您不能使用 strlen() 的结果静态初始化数据结构,您可以遍历字符串并将字符串长度存储在初始化函数中。

      【讨论】:

        【解决方案5】:

        你不能。 sizeof 不返回字符串的长度,而是返回数组的大小,在第二种情况下,它远大于字符串的长度。你需要使用strlen 或者,也许,一个更有特色的字符串类型:

        struct {
          size_t len;
          char data[]; 
        } string;
        

        但在这种情况下,将它们组成一个数组会有点复杂。

        【讨论】:

          【解决方案6】:

          如果你使用 char*a[] = {"foo", ...} 风格的 decleration,那么你可以使用 strlen(a[0])、strlen(a[1]) 等来找到每个字符串。

          【讨论】:

            【解决方案7】:

            也许你可以这样开始:

            size1 = abs(a[0] - a[1]);
            

            这将为您提供第一个字符串的起始地址和第二个字符串的起始地址之间的差异。因此第一个字符串的大小。

            然后你可以使用一些循环和数组来获取所有的大小。

            它不是静态的,但也许你可以试试。

            【讨论】:

              猜你喜欢
              • 2020-12-02
              • 1970-01-01
              • 2016-03-05
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-11-20
              相关资源
              最近更新 更多