我怀疑这一行flag[str[i]-'a']++;
这条线是如何工作的。
如需完整的计划访问http://www.programmingsimplified.com/c/source-code/c-anagram-program
char str[44];
int flag[26],i=0;
gets(str);
while(str[i]!='\0')
{
flag[str[i]-'a']++; // How this line work
i++;
}
i=0;
while(str[i]!='\0')
{
printf("\n%d, %d ",str[i]-'a');
i++;
}
答案 0 :(得分:3)
小写'a'解析为十进制97.减去97基本上允许您使用字符'a','b','c'等作为flag
数组的索引。一旦你有了,++
正在递增数组中相应的字母槽。
所以flag[0]
代表字母'a',flag[1]
代表字母'b',依此类推。
答案 1 :(得分:1)
我猜你在str[i]
中有一个小写字母,在这种情况下,str[i]-'a'
将代表字母的数字,如
a=0
b=1
c=2
.
.
.
最后你有
flag[str[i]-'a']++;
所以它是一个字母数组,每次迭代递增当前字母的单元格,通常它计算每个字母出现的次数
例如,如果你有字符串“aaccdvb
你会得到:
str[0] = 2
str[1] = 1
str[2] = 2
str[3] = 1
str[21] = 1
其他所有都是0
答案 2 :(得分:0)
flag[str[i]-'a']++;
后递增标志[someindex]值
someindex vale计算为str [i] - ' a'
if str[i]='c' then
someindex='c'-'a' ==> someindex=2
后递增标志[2];
答案 3 :(得分:0)
没有真正解析程序的其余部分...... flag[str[i]-'a']++
转换为:
获取值str[i]
并从'a'
中减去它。 'a'
以ASCII格式解析为97,因此您将获取str[i]
中的任何值并从97中减去它。
获取差异的结果并将其用作flag
数组的索引。
对前两步确定的结果值应用后递增操作。