调用 Parse int 函数时编译 parse 整数程序时出现问题

trouble compiling a parse integer program when calling the parse int function

本文关键字:程序 问题 整数 编译 Parse int 函数 调用 parse      更新时间:2023-10-16

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

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 函数时,我收到的两条错误消息是: - 无法将右值 (char( (char*( (&integers( 绑定到"(char&(" - 从"char*"到字符的转换无效 [-允许]

我只是很难准确理解错误代码试图表达的内容,我试图更多地理解它们。

这里有很多错误。

  1. sizeof(userInput)不像您期望的那样工作(user4581301 在评论中提到了这一点(。userInput是参数,并且由于参数类型调整。

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

    结果,您的循环最多只能达到sizeof (char*).

  2. 您正在读取字符串,但检查每个字符的数值。 不要指望'1' == 1,在任何常用的字符编码上都不是真的。(EloyBG提到了这个(

  3. 您将integers声明为仅对一个整数的引用,但尝试传递整个数组。(伊兰提到过这个(

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

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


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

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

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

在parseInt中,整数像单个字符一样声明,但你传递的是一个数组。此外,您将用户输入作为整数而不是 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++)
{

在这里,您将用户输入与 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. 将用户输入作为 ASCII 而不是整数进行比较(您可以将其比较为整数,但您必须使用与 ASCII 表上的字符对应的整数(
  3. 删除 cin.ignore(( 行

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

将字符更改为字符[40]

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