[英]Incorrect Array usage in C++
所以我应该做一个函数,它接受一个数组并“删除”偶数,只吐出奇数。 我们已经获得了部分代码,如下所示:
int arr1[] = {1, 4, 7, 1, 2, 10, 1};
int size = sizeof(arr1) / sizeof(int);
keepOdd(arr1, size);
for (int i = 0; i < size; i++)
cout << arr1[i] << " ";
cout << endl << "Totally " << size << " values left.";
我接受了它并对其进行了扩展,然后我想到了:
void keepOdd(int[], int);
void keepOdd(int& arr, int& size) {
int counter, newarr[size];
counter = 0;
for (int i = 0; i < size; i++) {
if (arr[i] % 2 == 1) {
counter++;
newarr[i]= arr[i];
}
}
size = counter;
for (int i = 0; i < size; i++)
arr[i]=newarr[i];
}
int main () {
int arr1[] = {1, 4, 7, 1, 2, 10, 1};
int size = sizeof(arr1) / sizeof(int);
keepOdd(arr1, size);
for (int i = 0; i < size; i++)
std::cout << arr1[i] << " ";
std::cout << endl << "Totally " << size << " values left.";
}
但是我的代码根本无法运行。
这是错误消息:
extra credit.cpp: In function 'void keepOdd(int&, int&)':
extra credit.cpp:15:13: error: invalid types 'int[int]' for array subscript
if (arr[i] % 2 == 1) {
^
extra credit.cpp:17:23: error: invalid types 'int[int]' for array subscript
newarr[i]= arr[i];
^
extra credit.cpp:22:9: error: invalid types 'int[int]' for array subscript
arr[i]=newarr[i];
^
extra credit.cpp: In function 'int main()':
extra credit.cpp:36:14: error: 'endl' was not declared in this scope
std::cout << endl << "Totally " << size << " values left.";
^~~~
extra credit.cpp:36:14: note: suggested alternative:
iostream:39:0,
from extra credit.cpp:1:
ostream:590:5: note: 'std::endl'
endl(basic_ostream<_CharT, _Traits>& __os)
^~~~
我必须使用数组,但看不到如何正确使用数组。
问题在这里:
void keepOdd(int& arr, int& size) {
^^^^^^^^
函数名称为arr
的第一个参数的类型是“对整数的引用”。
在函数内的这一行:
newarr[i]= arr[i];
^^^^^^
您对引用的整数应用下标运算符。 没有这样的运算符,左侧参数( arr
)和右侧参数( i
)都是整数。 这样,程序格式不正确。 因此,编译器错误:
error: invalid types 'int[int]' for array subscript newarr[i]= arr[i];
参数的相同问题也是其他类型不匹配错误的原因。
我怀疑您可能打算改用指针参数。
error: 'endl' was not declared in this scope
您已在程序中使用了标识符endl
。 您的程序中没有endl
声明。 那就是编译器告诉您的。
编译器还为您找到了潜在的解决方案:
note: suggested alternative: iostream:39:0 note: 'std::endl'
编译器告诉您的是,在头文件<iostream>
声明了std::endl
。 <iostream>
是标准库头。 如果您确实打算使用std::endl
(我怀疑您这样做过),则可以通过键入std::endl
而不是endl
来使用它。
PS,您可能不需要使用std::endl
。 '\\n'
对您来说可能就足够了,不会因为刷新输出流而不必要地降低程序速度。
int counter, newarr[size];
size
不是编译时间常数。 自动数组的长度必须是编译时间常数。 因此,该程序格式错误。
如果需要长度在运行时确定的数组,则可以动态分配该数组。 动态分配数组的最简单方法是使用std::vector
。
为了使代码正常工作,需要进行一些更改:
首先,用于传递数组和大小的函数标头如下所示:
int keepOdd(int* arr, int size);
请注意,我们将返回一个int:这是数组的新大小。
然后,可以大大简化keepOdd的逻辑:
int keepOdd(int* arr, int size) {
int counter;
counter = 0;
for (int i = 0; i < size; i++) {
if (arr[i] % 2 == 1) {
arr[counter++]= arr[i];
}
}
return counter;
}
在这里,您无需创建新的数组:您将使用下一个奇数元素重写偶数元素,并返回新的数组大小。
然后,只需使用新的大小来打印元素:
int main () {
int arr1[] = {1, 4, 7, 1, 2, 10, 1};
int size = sizeof(arr1) / sizeof(arr1[0]);
std::cout << "size is " << size << "\n";
int newSize = keepOdd(arr1, size);
for (int i = 0; i < newSize; i++)
std::cout << arr1[i] << " ";
std::cout << std::endl << "Totally " << size << " values left.";
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.