2016-10-17 9 views
0

文字列のアナグラムを見つけるコードは次のとおりです。私はそれを行うポインタ配列を使用していますが、ポインタの算術を使用してそれをしたい。ポインタ演算を使用する文字列のアナグラム

#include <stdio.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); 

    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; 
} 

- >ポインタ演算を使用してそれを見つける方法。 >それが動作するように、我々は以下の方法にそれを修正することができます

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

アナグラム例:銃 - > NUG。 game-> agem – King

+0

CやC++で配列を使うときは、すでにポインタを使っています。ローポインタを使うように変換するとスピードを上げることができず、コードを読むのがずっと難しくなります。あなたがこれをやっている理由はありますか? – Dai

+0

ところで、アナグラムを検出するために2つのヒストグラムは必要なく、1つのヒストグラムと2つのループだけでアナグラムを検出できるので、プログラムを33%高速化できます。 – Dai

答えて

0

first[a[c]-'a']++ = first[*(a+c)-'a']++ = (*(first+(*(a+c)-'a')))++

0

通常の方法 -

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

:whileループで

ポインタを使用して配列を処理するには、配列の先頭へのポインタを初期化してから、ポインタの算術演算を行うのではなく、インクリメントする毎回最初からndex。あなたにもfirstのためにポインタ演算を使用する必要がある場合

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

、それは次のようになります。

(*(first + *c - 'a'))++ 
関連する問題