以下C函数如何工作?

时间:2013-11-13 07:25:01

标签: c

我正在检查字符串字谜。但我无法理解背后的逻辑 int check_anagram(char a[], char b[])函数。

此代码仅提供小写字母或大写字符串anagram。 我想让它不区分大小写。请提供必要的更改。

#include<stdio.h>
#include<conio.h>
#include<string.h>

int check_anagram(char [], char []);

int main()
{
   char a[100], b[100];
   int flag;

   printf("Enter first string\n");
   gets(a);

   printf("Enter second string\n");
   gets(b);

   flag = check_anagram(a, b);

   if (flag == 1)
      printf("\"%s\" and \"%s\" are anagrams.\n", a, b);
   else
      printf("\"%s\" and \"%s\" are not anagrams.\n", a, b);
   system("pause");
   return 0;

}




    int check_anagram(char a[], char b[])
    {
       int first[26] = {0}, second[26] = {0}, c = 0;

       while (a[c] != '\0')
       {
          first[a[c]-'a']++;
          c++;
       }

       c = 0;

       while (b[c] != '\0')
       {
          second[b[c]-'a']++;
          c++;
       }

       for (c = 0; c < 26; c++)
       {
          if (first[c] != second[c])
             return 0;
       }

       return 1;
    }

请妥善解释:

  1. first[a[c]-'a']++;
  2. second[b[c]-'a']++;

2 个答案:

答案 0 :(得分:2)

first[a[c]-'a']++;

取字符串'a'的第c个字母的字母索引(0-26)。例如,如果我们输入“test”,那么对于每个字母,a [c]等于:

't','e','s','t'

然后a [c] - 'a'等于(其中'a'== 97和't'== 116):

19,4,18,19

然后首先[a [c] - 'a'] ++增加每个字符的字母索引,所以首先最终会像:

 a       e                           s t
{0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,0,0,0,0,0,0}

要使代码正常工作,您只需预先格式化每个字符串,使它们都是小写字母,或者检查大写字母并添加32(ascii差异)。查看一个ascii表来帮助您,这里有一个:ASCII TABLE - IMAGE

答案 1 :(得分:1)

a[c]char。字符用C表示,通过ASCII,代码使用0-255范围内的不同integera作为字符。 char s的算术是通过这些代码完成的。

字母a-z由一组连续的整数进行ASCII编码,因此当letter - 'a'为小写字母时,您可以使用letter之类的表达式来获取该字母的索引。 (即'a' - 'a'为0,'b' - 'a'为1,'c' - 'a'为2,等等。)这使您可以轻松地将字母转换为索引以便在数组中使用。