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语言,如何找到二维数组中单词的长度?的主要内容,如果未能解决你的问题,请参考以下文章