2013-09-03 4 views
0

Я начинаю C++ и написал программу, чтобы проверить, являются ли две фразы анаграммами. Символы читаются по одному и сохраняются в массиве. У меня все работает, кроме как в некоторых случаях добавляются дополнительные символы в массив.Дополнительные символы, вставленные в массив

Например, если я введу фразы AABB и Авва, это выход из программы:

Введите две строки, которые могут быть анаграммы:
-> ААББ
-> авва
Строка A is aabb
String B is abbai?
Две строки не являются анаграммами.

Они должны быть анаграммами, но по какой-то причине, я? добавляется в массив, заставляя фразы не быть анаграммами. Я, вероятно, не замечаю простую ошибку в коде, но буду очень признателен за любую обратную связь.

Вот код:

#include <string> 
#include <algorithm> 
#include <iostream> 
using namespace std; 

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

int main() 
{ 
    char ch, a[60], b[60]; 
    int flag, i; 

    cout << "Enter two lines that might be anagrams:" << endl; 
    cout << "--> "; 

    cin.get(ch); 
    ch = tolower(ch); 

    i = 0; 
    while (ch != '\n') 
    { 
     if (ch > '@') { 
      a[i] = ch; 
      i++; 
     } 
     cin.get(ch); 
     ch = tolower(ch); 
    } 

    cout << "--> "; 

    cin.get(ch); 
    ch = tolower(ch); 

    i = 0; 
    while (ch != '\n') 
    { 
     if (ch > '@') { 
      b[i] = ch; 
       i++; 
     } 
     cin.get(ch); 
     ch = tolower(ch); 
    } 

    flag = check_anagram(a, b); 

    cout << "String A is " << a << endl; 
    cout << "String B is " << b << endl; 

    cout << "The two strings "; 
    if (flag == 1) 
     cout << "ARE"; 
    else 
     cout << "are NOT"; 
    cout << " anagrams." << endl << endl; 

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

Заранее спасибо!

ответ

3

Вам просто нужно закончить два символьных массива с помощью '\0', потому что логика в check_anagram рассматривает оба массива как NULL-terminated.

.. 
    while (ch != '\n') 
    { 
     if (ch > '@') { 
     a[i] = ch; 
     i++; 
     } 
     cin.get(ch); 
     ch = tolower(ch); 
    } 

    a[i] = '\0';  // <<<<<<<< Add this line 
    cout << "--> "; 

    cin.get(ch); 
    ch = tolower(ch); 

    i = 0; 
    while (ch != '\n') 
    { 
     if (ch > '@') { 
     b[i] = ch; 
     i++; 
     } 
     cin.get(ch); 
     ch = tolower(ch); 
    } 

    b[i] = '\0';  // <<<<<<<< Add this line 
    .. 

Вот результат:

Enter two lines that might be anagrams: 
--> aabb 
--> abba 
String A is aabb 
String B is abba 
The two strings ARE anagrams. 
+0

Я знал, что это было что-то просто. Спасибо огромное! – Mitchell

+0

@ Митчелл, добро пожаловать;) –

Смежные вопросы