C语言,如何找到二维数组中单词的长度?

Posted

技术标签:

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

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

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

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

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

【问题讨论】:

【参考方案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',尽管我更喜欢明确的比较)。

以上是关于C语言,如何找到二维数组中单词的长度?的主要内容,如果未能解决你的问题,请参考以下文章

C语言中如何定义一个二维数组,数组长度由输入值确定?

c语言如何表示二维数组里面有#

C语言怎么定义一个二维数组可以使每行的输入长度任意

C语言中二维字符数组应该怎样赋值?

C语言 二维数组遍历

C语言函数传递二维数组