2015-02-05 2 views
-1

Мне нужно создать небольшую программу на C++, ожидая ввода строки и вывода ее содержимого буквами (сколько у нее есть, и так далее).C++ - проблема с конфронтацией строк

Я делаю это, создавая целочисленный массив из 26 блоков и столкнувшись с циклом for для моей строки со строкой «ABCDEFGHIJKLMNOPQRSTUVWXYZ» и нижний регистр. Если соответствие найдено с индексом i, значение блока i-го массива увеличивается на единицу, а цикл for нарушается.

Однако у меня есть небольшая проблема: если символ, не присутствующий в строке алфавита, вставлен (как пробел или апостроф), он считается соответствием для i = 0 (буква A). Однако, если я включаю этот символ в свою строку алфавита и цикл через него с моим, проблема не возникает.

Это мой .cc файл (реализация функций)

#include "08.Count.h" 
#include <string> 
#include <iostream> 

using namespace std; 

int chartoint (char a) { 
//Converts an alphabetic character to its corresponding position in the alphabet (as an integer) 
    string alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
    string alphabet2 = "abcdefghijklmnopqrstuvwxyz"; 

    for (int i=0; i<26; i++) 

     if ((a==alphabet[i])||(a==alphabet2[i])) { 
     //check if the char corresponds to the upper-case OR lower-case i-th letter of the alphabet 
      return i; 
      //when we find a correspondence, we output the point at where we've found it 
      break; 
      //waste of time continuing cycling if the correspondence is already found 
      } 

} 

void list (string word) { 
//Outputs the alphabetic distribution of the input string 
    int array[26]; 
    //array to store the correspondence data for each alphabet letter 
    for (int i=0; i<26; i++) 

     array[i]=0; //Initialize 

    for (int i=0; word[i]!='\0'; i++) 

     array[chartoint(word[i])]++; 
     //chartoint(word[i]) outputs the position of the alphabet the i-th character of the string word corresponds. We increment the value of that position in the array by one 
    string alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 

    for (int i=0; i<26; i++) 

     if (array[i]!=0) 

      cout << array[i] << " " << alphabet [i] << ", "; 
    //we output the distribution in letters, but only for the letters that are found at least one time 
} 

И это моя главная программа

#include <iostream> 
#include <string> 
#include "08.Count.h" 

using namespace std; 

int main() 

{ 

    string word; 

    cout << "Insert phrase" << endl; 

    getline(cin, word); 
    //To avoid the input string being terminated by a whitespace 
    cout << "The phrase " << word << " contains:" << endl; 

    list (word); 

    cout << endl; 

} 

ответ

1

В вашей chartoint функции есть только один return внутри цикла. Нет никаких мер для обработки, когда символ не является алфавитом. So in that case the return value is undefined (для вас это возвращается как 0)

Таким образом изменить функцию chartoint в

int chartoint (char a) { 

string alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
string alphabet2 = "abcdefghijklmnopqrstuvwxyz"; 

for (int i=0; i<26; i++) 

    if ((a==alphabet[i])||(a==alphabet2[i])) { 
     return i; 
     } 
return -1; // <------ indicates a is not an alphabet 
} 

Изменение списка функций в

void list (string word) { 

int array[26],index; 
for (int i=0; i<26; i++) 
    array[i]=0; //Initialize 

for (int i=0; word[i]!='\0'; i++) 
{ 
    index = chartoint(word[i]); 
    if(index!=-1) // <--- Check returned index 
    array[index]++; 
} 
string alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 

for (int i=0; i<26; i++) 
    if (array[i]!=0) 
     cout << array[i] << " " << alphabet [i] << ", "; 

} 

Итак, если возвращается index не -1 приращение соответствующего число символов на 1. Просто игнорируйте его, потому что это не алфавит.

+0

Какой идиот! Я не думал, что мне не хватает возврата, если корреспонденция не будет найдена. Большое спасибо! Однако, не следует ли размещать еще до «return -1»? И я думаю, что лучше, если я сделаю свой массив 27 ячеек длиннее и поставлю «else return 26», и оставим функцию списка нетронутой, так как она немного проще и легче. Таким образом, если рассмотренный символ не является алфавитом, возвращается 26, 26-я ячейка моего массива получает ++, но в процессе печати игнорируется. –

+0

@JeffreyLebowski 'else' не требуется, поскольку' return -1' выходит из цикла (т. Е. Возвращается, когда совпадение не найдено). Если он находится внутри цикла, тогда '-1' будет возвращен', когда есть несоответствие в первая позиция' .. Да, вы можете вернуться 26. Так что просто замените 'return -1' на' return i' после цикла. (потому что значение 'i' будет' 26' в конце цикла) – user7

+1

@JeffreyLebowski '-1 - это стандартное недопустимое возвращаемое значение. поскольку -1 никогда не будет действительным индексом в вашем массиве, это хороший выбор, лучше 26. «26» - волшебное число. он работает здесь, но только из-за вашего особого случая. Если вы добавляете символы в соответствующий массив, вы должны изменить значение. Кроме того, все, кто читает ваш код, задаются вопросом: «Почему 26 является специальным значением?», Тогда как «-1» является очевидным недопустимым значением. –