проблема компиляции целочисленной программы разбора при вызове функции parse int - PullRequest
0 голосов
/ 08 июня 2018

В настоящее время у меня возникли проблемы с реализацией разборной целочисленной программы.Я получаю две желтые линии, появляющиеся под функцией, когда она вызывается в программе

using namespace std;

char parseInt(char userInput[40], char& integers);

int main() 
{
    char userInput[40]; 
    char integers[40];

    cout << "After you enter string input, the program will parse all the integers "
         <<  "inside the string and display them.  \n  Enter a string:  \n";
    cin.ignore();
    cin.getline(userInput, 40);

    parseInt(userInput, integers);   //Here lies the problem

    cout << "The integers inside the string you entered were: \n" << integers;

    return 0;
}

char parseInt(char userInput[40], char& integers)
{
    int j = 0;
    for(int i = 0; i<sizeof(userInput); i++)
    {
        if( userInput[i] == 1 || userInput[i] == 2 || userInput[i] == 3 || 
            userInput[i] == 4 || userInput[i] == 5 || userInput[i] == 6 ||
            userInput[i] == 7 || userInput[i] == 8 || userInput[i] == 9 ||
            userInput[i] == 0 )
        {
            integers = userInput[i];
            j++;
        }
    }
}

Когда вызывается функция parse Int, я получаю два сообщения об ошибках: -cannot bind rvalue (char)(char *) (& целые числа) в '(char &)' - неправильное преобразование из 'char *' в char [-fpermissive]

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

Ответы [ 3 ]

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

В parseInt целые числа объявляются как один символ, но вы передаете массив.Кроме того, вы сравниваете userInput как целое число, а не как ASCII.

void parseInt(char userInput[40], char integers[40])
{
    int j = 0;
    for(int i = 0; i<sizeof(userInput); i++)
    {
        if( userInput[i] == '1' || userInput[i] == '2' || userInput[i] == '3' || 
        userInput[i] == '4' || userInput[i] == '5' || userInput[i] == '6' ||
        userInput[i] == '7' || userInput[i] == '8' || userInput[i] == '9' ||
        userInput[i] == '0' )
        {
            integers[j] = userInput[i];
            j++;

        }
    }


}

Если вы используете свой код,

Он возвращает один символ по ссылке, но не возвращает цепочку символов.

char parseInt(char userInput[40], char& integers)
{
    int j = 0;
    for(int i = 0; i<sizeof(userInput); i++)
    {

Здесь вы сравниваете userInput с первыми элементами таблицы ASCII.

        if( userInput[i] == 1 || userInput[i] == 2 || userInput[i] == 3 || 
            userInput[i] == 4 || userInput[i] == 5 || userInput[i] == 6 ||
            userInput[i] == 7 || userInput[i] == 8 || userInput[i] == 9 ||
            userInput[i] == 0 )
        {

В следующей строке вы изменяете значение одного символа, но недобавление нового символа, потому что это не массив (я полагаю, вы поняли идею, потому что вы объявляете j)

            integers = userInput[i];
            j++;
        }
    }
}

В основном,

cin.ignore()

не нужно, это делаетчто вы теряете первого персонажа цепочки.

  1. Объявите целые числа как массив символов
  2. Сравните userInput как ASCII, а не как целое число (вы можете сравнить его как целое число, но вы должны использовать целое число, соответствующее символу наТаблица ASCII)
  3. Удалить строку cin.ignore ()
0 голосов
/ 08 июня 2018

Здесь много ошибок.

  1. sizeof(userInput) не работает так, как вы ожидаете (пользователь4581301 упомянул об этом в комментарии).userInput является параметром, и из-за настройки типа параметра.

    Тип функции определяется с использованием следующих правил.Тип каждого параметра (включая пакеты параметров функции) определяется из его собственных decl-спецификатор-seq и декларатор .После определения типа каждого параметра любой параметр типа "массив из T" или типа функции T настраивается на указатель на T ".После создания списка типов параметров любые верхние уровни cv-qualifiers , модифицирующие тип параметра, удаляются при формировании типа функции.

    В результате ваш цикл только идетдо sizeof (char*).

  2. Вы читаете строку, но проверяете числовое значение каждого символа.Не ожидайте, что '1' == 1, это не так для любой широко используемой кодировки символов.(EloyBG упомянул это)

  3. Вы объявили integers как ссылку только на одно целое число, но попытались передать весь массив.(Илан упомянул это)

  4. Вы пытаетесь вставить много значений в ссылку только на одно целое число.(EloyBG тоже упоминал об этом, но его исправление вводит в заблуждение по той же причине, что и # 1)

  5. Достижение конца не-1045 * функции недопустимо, вы должны вернутьзначение или оставить ненормально (user4581301 упомянул об этом тоже)


C способ исправить это - передать длину массива в качестве отдельного параметра.В C ++ вы можете использовать ссылку на массив, чтобы принудительно установить фиксированную длину или даже вывести фактическую длину:

void parseInt(char (&userInput)[40], char (&integers)[40])

При корректировке параметров изменяются только массивы, а не ссылки на массивы, и, следовательно, ваша попытка sizeofснова будет работать.

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

Вы передаете целые числа char [40] в функцию, для второго параметра которой требуется передать символ по ссылке.

изменить char & на char [40]

char parseInt(char userInput[40], char integers[40])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...