C++ 调用parse int函数时编译parse integer程序时出现问题

C++ 调用parse int函数时编译parse integer程序时出现问题,c++,parsing,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

目前,我在实现我制作的解析整数程序时遇到了一些问题。在程序中调用函数时,函数下面会出现两条黄线

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++;
        }
    }
}
使用名称空间std;
char parseInt(char userInput[40],char和整数);
int main()
{
字符用户输入[40];
字符整数[40];

cout您正在将字符整数[40]传递到一个函数中,该函数的第二个参数要求通过引用传递字符

将char&更改为char[40]

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

在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++;

        }
    }


}
在下一行中,您更改单个字符的值,但不添加新字符,因为它不是数组(我相信您是因为声明了j才知道这一点的)

总的来说

cin.ignore()
是不必要的,它会使您丢失链的第一个字符

  • 像字符数组一样声明整数
  • 将userInput比较为ASCII而不是整数(您可以将其比较为整数,但必须使用与ASCII表上的字符对应的整数)
  • 删除cin.ignore()行
  • 这里有很多虫子

  • sizeof(userInput)
    的工作方式与您预期的不一样(user4581301在评论中提到了这一点)。
    userInput
    是一个参数,由于参数类型的调整

    使用以下规则确定函数的类型。每个参数(包括函数参数包)的类型由其自身的decl说明符seq和声明符确定。确定每个参数的类型后,类型为“数组of
    T
    ”的任何参数
    或函数类型的
    T
    被调整为“指向
    T
    。生成参数类型列表后,在形成函数类型时删除修改参数类型的任何顶级cv限定符

    因此,循环只会上升到
    sizeof(char*)

  • 您正在读取字符串,但正在检查每个字符的数值。不要期望
    '1'==1
    ,这在常用的任何字符编码中都不是真的。(EloyBG提到了这一点)

  • 您将
    整数声明为仅对一个整数的引用,但试图传递整个数组

  • 您正试图将多个值塞进一个只指向一个整数的引用中。(EloyBG也提到了这一点,但他的修复方法具有误导性,原因与#1相同)

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


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

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

    参数调整只会更改数组,而不会引用数组,因此您的
    sizeof
    尝试将再次起作用。

    不是向下的投票者,但这会破坏函数中的OP代码。这是事实,但OP函数中的其他一些东西会破坏OP函数。如果您稍微理顺Doe,您的答案可能会更受欢迎他只问编译器为什么抱怨,我回答他为什么我的任务是同时修复他的所有代码?修复,不。这在一定程度上是他们的问题。有时你必须删除代码来解释解决方案。在这种情况下,你可以清除编译器捕获并替换的一个错误您应该说明您的解决方案将如何处理
    integers=userInput[i]
    并解释为什么您的解决方案是正确的。指出1与“1”不同,或者给他们一个指向
    isdigit
    文档页面的链接将是友好的。警告他们在
    parseInt
    中没有返回任何内容,而代码承诺返回的内容可能是神圣的。指出
    sizeof(userInput)
    ,这将帮助他们解决大量问题。你不必修复任何问题。他们应该能够自己解决。更喜欢你的答案,而不是我的答案。更简洁。建议编辑以添加
    忽略
    丢弃用户输入的第一个字符。
                integers = userInput[i];
                j++;
            }
        }
    }
    
    cin.ignore()
    
    void parseInt(char (&userInput)[40], char (&integers)[40])