目前,我在实现我已经完成的解析整数程序时遇到了一些麻烦。当在程序中调用
时,我会在函数下面出现两条黄色线条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]
我很难理解错误代码的确切含义,我试图更多地了解它们。
答案 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 :(得分:1)
这里有很多错误。
sizeof(userInput)
无法正常工作(用户4581301在评论中提及此内容)。 userInput
是一个参数,由于参数类型调整。
使用以下规则确定函数的类型。每个参数的类型(包括函数参数包)由其自己的 decl-specifier-seq 和声明符确定。确定每个参数的类型后,类型为“
T
”的数组或函数类型T
的任何参数都会调整为“指向{{1的指针” }}“即可。生成参数类型列表后,在形成函数类型时,将删除修改参数类型的任何顶级 cv-qualifiers 。
因此,您的循环最多只能达到T
。
您正在读取字符串但检查每个字符的数值。不要指望sizeof (char*)
,在常用的任何字符编码上都不行。 (EloyBG提到了这个)
您将'1' == 1
声明为仅对一个整数的引用,但尝试传递整个数组。 (Ilan提到了这一点)
您尝试将多个值填充到仅一个整数的引用中。 (EloyBG也提到了这一点,但由于与#1相同的原因,他的修正具有误导性)
到达非integers
函数的末尾是非法的,您必须返回一个值或异常离开(user4581301也提到了这一点)
修复它的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])