繁体   English   中英

C ++中数组使用不正确

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM