next up previous index
Next: Sorting and searching Up: Anagram-checking Previous: Problem Specification

The Program

// Anagram checking program.

#include <mstring.h>  // defines line type (character string ended by newline)
#include <vector.h>
#include <algo.h>

void lowercase(line& line1) 
   // Convert all uppercase letters in line1 to lowercase
{
     for (int i = 0; line1[i] != '\0'; ++i)
        if ('A' <= line1[i] && line1[i] <= 'Z')
           line1[i] += 32;
}

void remove_blanks(line& line1)
   // Squeeze out all blank characters in line1
{
   line::iterator i = remove(line1.begin(), line1.end(), ' ');
      // i now points just past the end of retained characters
   line1.erase(i, line1.end());
}     

void standardize(line& line1)
   // Put line1 in a standard form: all lowercase, no blanks, sorted
{
   lowercase(line1);
   remove_blanks(line1);
   sort(line1.begin(), line1.end());
}

bool anagrams(line line1, line line2)
   // Returns true if line1 and line2 are anagrams,
   // ignoring all blanks and case of letters
{
   standardize(line1);
   standardize(line2);
   return line1 == line2; 
          // true if lines are equal in all corresponding character positions
}

int main() 
   // Repeatedly read two lines and test whether they are anagrams.
   // Terminate when first line has two or fewer characters before newline.
{
   while (true) {

      line line1, line2;   // line is a type defined in mstring.h

      cin >> line1;   // keeps newline and appends null character
      cin >> line2;

      if (line1.size() < 4)  /* terminate if less than 2 characters
                                (besides newline and null) */
          break;

      cout << line1;
      cout << line2;

      if (anagrams(line1, line2))
          cout << "Yes, the above two lines are anagrams!\n";
      else
          cout << "No, the above two lines are not anagrams.\n";

      cout << "\n\n\n";
   }

   return 0;
}



Kenny Zalewski
Mon May 13 04:03:40 EDT 1996