Попытка прочитать один символ за раз в массиве неопределенного размера - PullRequest
0 голосов
/ 25 июня 2018

Я студент CS, работаю над проектом c ++. Мы были проинструктированы объявить структуру и использовать ее для чтения массива символов и подсчета того, сколько букв используется в строке. Нам не разрешено использовать строку; это ДОЛЖЕН быть массив нашей объявленной структуры. Ввод должен быть настолько длинным, насколько хочет пользователь; код должен иметь возможность принимать новые строки ввода и завершаться символом «.» Я действительно борюсь здесь. Я даже не знаю, с чего начать. Я собрал некоторый код, который лучше всего угадал, что делать, но он вылетает после нажатия «». затем войдите, и я не знаю почему.

//declare struct
struct data
{
    int tally = 0;
    char letter;
};

//size of string to read in at a time
const int SIZE_OF_CHUNK = 11;
int main()
{
//input chunk of struct
data    input[SIZE_OF_CHUNK];
int     placemark,
        length;

cout << "Enter sequence of characters, '.' to terminate:" << endl;

do
{
    for (int index = 0; (input[index].letter != '\0') && (input[index - 1].letter != '.'); index++)
    {
        cin >> input[index].letter;
        placemark++;
    }

    //I intend to put something here to handle if the code
    needs to read in another chunk, but I want to fix the crashing
    problem first
}
while (input[placemark].letter != '.');

//print out what was read in, just to check
for (int index = 0; input[index].letter != '\0'; index++)
{
    cout << input[index].letter;
}

return 0;
}

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

1 Ответ

0 голосов
/ 25 июня 2018

Вы уверены, что должны использовать объявленную структуру?

Если вы просто хотите посчитать, сколько раз символ появляется, вам не нужно хранить символ;вам просто нужно хранить количество раз, как оно появилось.Так что просто unsigned lettersCount[26], и каждый индекс отображается на букву (т.е. индекс 0 означает a, индекс 1 означает b).Когда появляется буква, просто увеличивайте счетчик этого индекса.

Вы можете сопоставить букву с индексом, используя ASCII .Каждая буква представлена ​​десятичным числом, которое вы можете найти в ASCII таблице .Например, буква a представлена ​​десятичным значением 97, b равно 98 и так далее.Число увеличивается последовательно, что мы можем использовать.Поэтому, если вы хотите сопоставить букву с индексом, все, что вам нужно сделать, это просто value - 97 или value - 'a'.Например, если вы прочитаете в письме a, уберите 97 из этого, и вы получите 0, что вы и хотите.После получения индекса, просто ++ увеличить счетчик этой буквы.

Относительно обработки прописных и строчных букв (то есть обрабатывать их одинаково или по-разному), вам решатьпонять, как это сделать (что должно быть довольно просто, если вы понимаете, что я объяснил).

...