Мне нужно создать небольшую программу на 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;
}
Какой идиот! Я не думал, что мне не хватает возврата, если корреспонденция не будет найдена. Большое спасибо! Однако, не следует ли размещать еще до «return -1»? И я думаю, что лучше, если я сделаю свой массив 27 ячеек длиннее и поставлю «else return 26», и оставим функцию списка нетронутой, так как она немного проще и легче. Таким образом, если рассмотренный символ не является алфавитом, возвращается 26, 26-я ячейка моего массива получает ++, но в процессе печати игнорируется. –
@JeffreyLebowski 'else' не требуется, поскольку' return -1' выходит из цикла (т. Е. Возвращается, когда совпадение не найдено). Если он находится внутри цикла, тогда '-1' будет возвращен', когда есть несоответствие в первая позиция' .. Да, вы можете вернуться 26. Так что просто замените 'return -1' на' return i' после цикла. (потому что значение 'i' будет' 26' в конце цикла) – user7
@JeffreyLebowski '-1 - это стандартное недопустимое возвращаемое значение. поскольку -1 никогда не будет действительным индексом в вашем массиве, это хороший выбор, лучше 26. «26» - волшебное число. он работает здесь, но только из-за вашего особого случая. Если вы добавляете символы в соответствующий массив, вы должны изменить значение. Кроме того, все, кто читает ваш код, задаются вопросом: «Почему 26 является специальным значением?», Тогда как «-1» является очевидным недопустимым значением. –