-4

我怀疑这条线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++;                        
}
4

4 回答 4

4

小写“a”解析为十进制 97。减去 97 基本上允许您使用字符“a”、“b”、“c”等作为flag数组的索引。一旦你有了它,++就会增加数组中适当的字母槽。

flag[0]字母“a”也是如此flag[1],字母“b”也是如此,依此类推。

于 2013-09-16T05:04:00.310 回答
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

于 2013-09-16T05:09:31.683 回答
1
flag[str[i]-'a']++;   

发布递增标志 [someindex] 值

someindex 值被计算 str[i]-'a'

if str[i]='c' then   
someindex='c'-'a'   ==> someindex=2  

后递增标志[2];

于 2013-09-16T05:04:09.130 回答
0

没有真正解析程序的其余部分......flag[str[i]-'a']++转换为:

  • 取一个值str[i]并从中减去'a''a'在 ASCII 中解析为 97,因此您将取其中的任何值str[i]并从 97 中减去它。

  • 获取差异的结果并将其用作flag数组的索引。

  • 应用由前两个步骤确定的结果值的后增量操作。

于 2013-09-16T05:05:41.113 回答