【问题标题】:C language, how find the length of a word in a 2d array?C语言,如何找到二维数组中单词的长度?
【发布时间】:2013-03-26 21:56:34
【问题描述】:

我正在尝试为 for 循环创建一个条件,我必须说 (c<wordlength) 但我不确定如何找到单词的长度。

所以假设我有一个名为...的数组

char shopping[10][10]={"BAGELS","HAM","EGGS"};

找到 shopping[0] 有 6 个字母的正确语法是什么?

【问题讨论】:

    标签: c string multidimensional-array string-length


    【解决方案1】:

    正确的语法是

    strlen(shopping[0])
    

    这将返回一个不包含 NUL 终止符的 size_t 类型的值。

    详情请见man strlen

    如果您使用strlen(unchanging_string) 作为循环的终止条件,谨慎的做法是在循环之前调用一次,而不是在每次迭代时调用它。

    循环遍历shopping[0] 的字符的另一种方法如下:

    char *s = shopping[0];
    while (*s) {
      /* (*s) is the current character */
    }
    

    【讨论】:

      【解决方案2】:
      size_t len = strlen(shopping[0]);
      

      但请注意,您不应该写:

      for (size_t i = 0; i < strlen(shopping[0]); i++)
      

      这可能会导致长字符串性能不佳。使用:

      size_t len = strlen(shopping[0]);
      for (size_t i = 0; i < len; i++)
      

      【讨论】:

      • 完全避免for循环不是更好吗? strlen() + 1 应该给出长度吧?
      • @Koushik:这取决于更大的背景;你到底想做什么。您可以为for (size_t i = 0; shopping[0][i] != '\0'; i++) 提供案例以及使用strlen() 的解决方案。后面的问题是“如何找到包含 6 个字符的字符串”,而我的第一个答案正是这样做的方法。开始的问题提到了for 循环;我假设了一些可能的for 循环结构并建议调用strlen() 一次而不是N 次。问题中没有更多代码,要提供更多帮助并不容易。
      【解决方案3】:

      实际上 shopping[0] 有 7 个字符,你忘记了一个用于字符串终止的 \0 字符。虽然strlen() 给你字符串的长度,但\0 之前的字符数。

      strlen(shopping[0])
      

      但总字符为strlen(shopping[0]) + 1 = 7

      在内存中,您的shopping[0] 类似于:

      +----+----+----+---+---+----+----+----+---+---+ 
      | 'B'| 'A' |'G'|'E'|'L'| 'S'|'\0'| 0  | 0 |   |
      +----+----+----+---+---+----+----+----+---+---+
                                    ^ `\0` also a char in shopping[0]
      

      编辑

      当我再次阅读您的问题时,您说 6 个字母所以strlen(shopping[0] ) 是您的答案,给您 6 个。

      因为您想要一个循环来查找字母数(我的答案中的字符不是'\0')然后调用strlen() 是没用的。我希望您应该利用 C 中的空终止字符串:

      int num=0;
      for(num = 0; shopping[0][num]!='\0'; num++);
      printf("\n  number of letters are %d\n",num);
      

      我认为其他答案不好,他们使用 strlen() 是不必要的。如果我遗漏了什么,请告诉我

      【讨论】:

      • 你有重新定义字符串的危险。 C 标准说(第 7.1.1 节定义):'A string 是由第一个空字符终止并包括第一个空字符的连续字符序列。 [...] 字符串的长度 是空字符之前的字节数。强调在 ISO/IEC 9899:2011 中。
      • @JonathanLeffler 我不认为我的答案是错误的字符串是 null \0 以 C 结尾。我错了吗?
      • @GrijeshChauhan shopping[0][num] = '\0' 是错误的。应该是相等而不是赋值
      • @GrijeshChauhan:我没有给你投反对票。我发表了评论,仅此而已。我的评论说你需要小心,而不是你真的错了。字符串中有7个字符;但是,字符串的长度是 6。有一个论点是为存储分配了 10 个字符。你不喜欢我的解决方案:好吧,那是你的特权。正如我对 Koushik 所评论的那样,很大程度上取决于代码中的其他内容 — 像往常一样,有不止一种方法可以做到这一点(TMTOWTDI — Perl 的座右铭)。
      • 您应该在最大速度优化下将您的for 循环与strlen() 进行基准测试。我的钱会花在strlen() 上,比你的循环快很多,尤其是在较长的字符串上。
      【解决方案4】:

      您可以使用for 循环编写代码来查找购物数组中每个元素的大小:

      for(i =0;i<10;i++)
      {
          j=0;
          while(shopping[i][j])
          {
              j++;
          }
      }
      

      j 将返回每个购物数组元素的大小。

      【讨论】:

      • 使用嵌套的for 循环会更好吗?内部可能是:for (j = 0; shopping[i][j] != '\0'; j++)。这将所有控件放在一行上(如果你愿意,你可以删除!= '\0',尽管我更喜欢明确的比较)。
      猜你喜欢
      • 1970-01-01
      • 2011-06-19
      • 2020-06-18
      • 2012-05-29
      • 1970-01-01
      • 2021-04-11
      • 1970-01-01
      • 1970-01-01
      • 2021-08-26
      相关资源
      最近更新 更多