在调用parse int函数时编译解析整数程序时遇到问题

时间:2018-06-07 23:40:34

标签: c++ parsing

目前,我在实现我已经完成的解析整数程序时遇到了一些麻烦。当在程序中调用

时,我会在函数下面出现两条黄色线条
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++;
        }
    }
}

调用解析Int函数时,我得到的两条错误消息是: - 无法将rvalue(char)(char *)(&amp;整数)绑定到&#39;(char&amp;)&#39; - 来自&#39; char *&#39;的无效转化to char [-fpermissive]

我很难理解错误代码的确切含​​义,我试图更多地了解它们。

3 个答案:

答案 0 :(得分:1)

在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()行

答案 1 :(得分:1)

这里有很多错误。

  1. sizeof(userInput)无法正常工作(用户4581301在评论中提及此内容)。 userInput是一个参数,由于参数类型调整。

      

    使用以下规则确定函数的类型。每个参数的类型(包括函数参数包)由其自己的 decl-specifier-seq 声明符确定。确定每个参数的类型后,类型为“T的数组或函数类型T 的任何参数都会调整为“指向{{1的指针” }}“即可。生成参数类型列表后,在形成函数类型时,将删除修改参数类型的任何顶级 cv-qualifiers

    因此,您的循环最多只能达到T

  2. 您正在读取字符串但检查每个字符的数值。不要指望sizeof (char*),在常用的任何字符编码上都不行。 (EloyBG提到了这个)

  3. 您将'1' == 1声明为仅对一个整数的引用,但尝试传递整个数组。 (Ilan提到了这一点)

  4. 您尝试将多个值填充到仅一个整数的引用中。 (EloyBG也提到了这一点,但由于与#1相同的原因,他的修正具有误导性)

  5. 到达非integers函数的末尾是非法的,您必须返回一个值或异常离开(user4581301也提到了这一点)

  6. 修复它的C方法是将数组的长度作为单独的参数传递。在C ++中,您可以使用对数组的引用来强制执行固定长度甚至推断实际长度:

    void

    参数调整仅更改数组,而不是对数组的引用,因此void parseInt(char (&userInput)[40], char (&integers)[40]) 尝试将再次起作用。

答案 2 :(得分:-1)

您正在将char整数[40]传递给一个函数,它的第二个参数需要通过引用传递char。

改变char&amp; to char [40]

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