Борьба с основами.Особенно char [], char * и чтение из массивов.Возможно, мне следует использовать строку типа - PullRequest
0 голосов
/ 18 апреля 2019

Мне нужно немного руководства.

Я хочу отточить свое мастерство, поэтому я тренируюсь с небольшими проектами.

Текущая задача - создать функцию, котораяумеет считать слоги в введенном пользователем слове .

Я думаю объявить массив гласных: a, e, i, o, u.

, затем выполнить итерацию введенного пользователемword, проверяя, совпадают ли какие-либо буквы слова с массивом гласных, и если да, проверьте, не соответствует ли следующая буква.(Я предполагаю, что слог определяется наличием гласного и согласного.)

Это потребуется для вложенных циклов, один для итерации по слову, а затем другой для итерации по массиву гласных стекущий индекс 'word'.

Я даже не понял, как я собираюсь сделать то же самое для слова [i + 1].

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

Вот что у меня есть (и оно не скомпилируется!):

#include <iostream>

char vowels[] = {'a', 'e', 'i', 'o', 'u'};

int numberOfSyllables(char *word)
{
    int numberOfVowelsFound = 0;

    for ( &element : word )
    {
        bool vowelMatch = 0;
        for ( &vowel : vowels)
        {
            if (element == vowel)
            {
                vowelMatch = 1;
                break;
            }
        }
    if ((vowelMatch == 1) numberOfVowelsFound++;
    }
    return numberOfVowelsFound;
}


int main()
{
char *userInput[50];

std::cout << "Enter a word: ";
std::cin >> *userInput;

std::cout << numberOfSyllables(userInput) << " syllables found";

    return 0;
}

1 Ответ

4 голосов
/ 19 апреля 2019

Это не сайт проверки кода, но я все равно буду стараться изо всех сил:

  1. Ваши for петли не имеют типов:
    for (TYPE &element : word )

Тип, который вы хотите зациклить в этом случае: char.

если вы хотите, чтобы компилятор определил тип для вас:

    for (auto &element : word)
  1. Вы перебираете цикл word с циклом стиля "foreach", но char * не может быть зациклен таким образом. Если быть точным, то для char * не определены функции std::begin и std::end, поэтому цикл стиля "foreach" не знает, где вы хотите, чтобы ваша строка начиналась / заканчивалась. Либо используйте другой стиль цикла, либо используйте тип, который поддерживает циклы стиля «foreach» (например, std::string или C ++ 17 std::string_view).

  2. Вы добавили дополнительные скобки ( в оператор if:

    //  |
    //  v
    if ((vowelMatch == 1) numberOfVowelsFound++;
  1. Вы объявляете вашу переменную userInput как «массив из 40 указателей на символы», но вы, вероятно, хотите записать в нее «символы», а не «указатели на символы». Измените его тип на «массив из 40 символов».

  2. Аналогично, вы разыменовываете свою переменную userInput (возможно, чтобы избежать предупреждения), которая, поскольку userInput является "массивом из 40 (указателей на char)", будет возвращать первый, неинициализированный, " указатель на символ "в этом массиве (*var совпадает с var[0] в этом случае). Просто удалите оператор разыменования * и измените тип массива, как предложено выше, и std::cin выяснит, что делать. Поскольку вы (ошибочно) разыменовали userInput уже во избежание предупреждения, std::cin считает, что вы хотите записать в местоположение, на которое указывает неинициализированный указатель. Вы не можете контролировать, где ваша программа будет писать на этом этапе; это может просто рухнуть.

  3. Наконец, вы снова передаете неправильный тип в numberOfSyllables(userInput), как упоминалось ранее, userInput - это «массив из 40 указателей на символ», в то время как ваша функция ожидает «указатель символов». Измените тип userInput на «массив символов», который компилятор может затем преобразовать в «указатель символов».

Финальный код:

// compile with -std=c++17 for std::string_view, or use another loop style
#include <string_view>
#include <iostream>

char vowels[] = {'a', 'e', 'i', 'o', 'u'};

int numberOfSyllables(char *word)
{
    int numberOfVowelsFound = 0;

    // `std::string_view` can be used in "foreach" style loops
    // we need to use `const char`, since `std::string_view` is a "fake string" and not writable
    for (const char &element : std::string_view(word))
    // Another loop style (This even works in C):
    // for (int i=0; word[i] != '\0'; i++) // While the current element is not NUL
    // {
    //     const char element = word[i]; // Remember the current element
    {
        bool vowelMatch = 0;
        for (const char &vowel : vowels) // Use const here too just for good measure
        {
            if (element == vowel)
            {
                vowelMatch = 1;
                break;
            }
        }
        if (vowelMatch == 1) numberOfVowelsFound++; // Removed a parenthesis here
    }
    return numberOfVowelsFound;
}


int main()
{
    char userInput[50]; // Changed type of this variable

    std::cout << "Enter a word: ";
    std::cin >> userInput; // Removed a dereference here
    std::cout << numberOfSyllables(userInput) << " syllables found";

    return 0;
}
...