1

在下面的代码中,语句str1[i] && str2[i];和具体count1[str1[i]]++;做什么?

char str1[4]="rate";
char str2[4]="tear";

int count1[256] ;
int count2[256] ;

int i=0;

for (i = 0; str1[i] && str2[i];  i++)
{
   count1[str1[i]]++;//count1['g']++what does that mean ?
   count2[str2[i]]++;
}
4

4 回答 4

10
for (i = 0; str1[i] && str2[i];  i++)

是相同的

for (i = 0; (str1[i] != 0) && (str2[i] != 0);  i++)

这与

for (i = 0; (str1[i] != '\0') && (str2[i] != '\0';  i++)

基本上,如果在条件语句中使用了任何表达式,则检查该值是否为布尔值 - 真或假。如果它不是布尔值 - 说它是一个整数类型,那么 0 就是false其他任何东西true

str[i]是一个char- 它是一个整数类型。因此,如果 str[i] 为 0,则它的计算结果为 false,否则它的计算结果为 true。

例如。

char c = 'A';

if(c)

是相同的

if (c != 0)

这与

if (c != '\0')

c 是“A”(在 ascii 中是 65)。65 != 0,因此它的计算结果为 true 并且if将被输入。

如果相反,你有

char c = 0;

或者

char c = '\0';

然后 c 评估为 0。因此 if(c) 评估为 false 并且未输入 if。

您可以将相同的逻辑扩展到 str[i] ,它是一个char.

如果有str1[]="rate",则与 相同 str1[0] = 'r', str1[1] = 'a', str1[2] = 't', str1[3] = 'e', str1[4] = 0

有关count1[str1[i]]++;

这是每个字符出现次数的计数 - 例如。如果 char 集是 ascii,则在字符串遍历结束时,count['A'](与 count[65] 相同)将包含字符串中出现 'A' 的次数。

只有当计数数组的每个成员都初始化到0某个地方(或者它们是全局的)时,它才会起作用。

考虑

str1[] = "ABAB";

count[str1[0]]count['A']which 相同count[65](如果 char set 是 ascii)。

++导致 count['A'] 变为 1

i变为 1 时,count[str1[1]]++导致count['B']变为 1. i= 2,然后count['A']变为 2. i= 3,然后count['B']变为 2。

于 2013-01-01T16:59:19.267 回答
3

该算法同时计算两个字符串中每个 ascii 字符的出现次数。

str1[i] && str2[i]

检查是否到达两个字符串的末尾。count1[str1[i]]++增加字符 str1[i] 的出现次数。

于 2013-01-01T17:02:31.503 回答
2

&& 适用于 2 个字符,而不是字符串。在这种情况下,它正在检查两个字符是否都不是空字符。

于 2013-01-01T16:59:09.867 回答
1

for (i = 0; str1[i] && str2[i]; i++)
循环运行较小的字符串长度的次数。
因为 '\0' 的 ASCII 值为零 (0) ,str1[i] 或 str2[i] 零表示并且零和循环结束

于 2013-01-01T17:01:55.180 回答