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