簡體   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