2015-10-16 78 views
0

我想要做的是允許用戶輸入任意數量的變量(例如:1 6 945 fhds),我的程序將檢查任何字符串。我聽說過陣列,但我覺得我只能限制用戶可以擁有多少輸入。 Foo似乎需要將預編碼輸入到程序中?任何人都可以澄清如何做到這一點?C++數組(無限輸入)

我嘗試:

#include <iostream> 
using namespace std; 

int main() { 
int x; 
int array[x]; 
cout << "Enter your numbers: "; 
for (int x = 0; x = <char>; ++x) { 
cin >> x; 
} 
cout << x; 
return 0; 
} 
+0

你想存儲的字符串,或者乾脆打印他們? – pushkin

+0

This'int x; int數組[x];'只會給你帶來痛苦。一方面它不會在所有編譯器上編譯,因爲x不是一個常量,但更重要的是,x沒有被賦值,所以如果這樣做編譯,數組的大小是不確定的。 – user4581301

+0

@ user4581301我想回應字符串:如果輸入是數字,請做y,如果沒有,請做x。這是我的另一個問題,但我認爲我一次只能提出一個問題。在這個特定的問題中,我不確定如何實際輸入無限的字符串,以及如何按順序掃描它們。 – NinaPortman

回答

-1

有問題少數到目前爲止,象變量「X」的多個聲明和missuses; for循環可能不應該使用x,因爲它已經被定義,並且x在未初始化時不應該是數組大小。

至於你想做什麼,這是很難說,但我想我可以幫助。

int main() 
{ 
    const int ARRAY_SIZE = 1000; //initialize so it doesn't end up being either 0 or literally anything 
    int myArray[ ARRAY_SIZE ]; 
    for(int x = 0; x < ARRAY_SIZE; x++) 
    { 
     cin >> myArray[ x ]; 
    } 
    return 0; 
} 

現在通過1000次這樣的循環會要求一個數字輸入,直到陣列寫飽滿,如果你希望能夠阻止數組你將不得不添加的方式來打破for循環並記錄停止的地方。

int main() 
{ 
    const int ARRAY_SIZE = 1000; 
    int myArray[ ARRAY_SIZE ]; 

    int arrayEnd = 0; 
    for(int x = 0; x < ARRAY_SIZE; x++) 
    { 
     int inputBuffer = 0; // this variable saves the users input and checks to see if the user wants to exit before saving the variable to myArray. 
     cin >> inputBuffer; 
     if(inputBuffer != -1) // -1 is just a value the user enters to stop the loop, choose any number you want for this. 
     { 
      myArray[ x ] = inputBuffer; 
     } 
     else 
     { 
      arrayEnd = x; 
      break; // stops the for loop if the number above is entered. 
     } 
    } 

    if(arrayEnd == 0) 
    { 
     arrayEnd = ARRAY_SIZE; 
    } 
    return 0; 
} 

如果你想忠實地無限或整數一個更具延展性陣列可以 int數組設置數組的大小,像這樣

int main() 
{ 
    int* myArray = nullptr; 
    int arraySize = 0; 
    cin >> arraySize; 

    myArray = new int[ arraySize ]; 

    for(int x = 0; x < arraySize; x++) 
    { 
     cin >> myArray[ x ]; 
    } 

    delete[] myArray; 
    return 0; 
} 

,但我不會」如果你沒有大部分的基礎知識,那麼建議使用new,因爲new很容易導致內存泄漏,並且要記住更多的小事情。

+0

雖然這種方法在直C中有一些優點,但由於消除其缺點所需的複雜性增加了很多,所以在C++中確實應該感到氣餒,因爲它幾乎不需要額外的努力來編寫不受限制且易於緩衝區超限。 – Hurkyl

+0

我不同意,而使用與OP這樣的向量相反的數組,你只能通過將數據存儲爲一個值來告訴數組的結束位置,這在每個示例中都是這樣做的;這只是一個小事情要記住,就像刪除new'd對象。 –

1

在C++中一個可調整大小的數組被稱爲「載體」:

vector<int> array; 
cout << "Enter your numbers: \n"; 

int temp; 
while (cin >> temp) 
    array.push_back(temp); 

cout << array.size() << '\n'; 
0

C++是不完全的快速語言拿起。有很多警告和設計模式,你需要做大量的學習,以便熟悉起來,不會造成傷害。 "The big list of books" user4581301建議是一個很好的開始。

在網上也有一些很好的參考文獻,但更糟糕的是。

您的問題有幾個問題,例如(除了已提到的初始化等問題)。

我會嘗試從更高的層次解決兩個問題。

  1. 我建議訴諸陣列時,你來。儘可能地選擇不同的抽象。明智地選擇你的數據類型。例如,這裏有一些標準containers。你也可以利用boost。您可以使用指針並將其視爲一個數組,在這種情況下,您完全可以控制管理內存。您甚至可以使用混合方法並使用像vector這樣的連續容器並通過指針訪問它。指針和數組相當脆弱,但容易出錯。面對例外情況,他們更是如此,我建議首先考慮RAII原則。

  2. 根據您計劃閱讀的數據,您可能需要考慮您正在使用的類型。您可能還需要考慮編碼。我想看看utf-8 everywhere以瞭解一些字符串世界。

0
  1. 閱讀完整內容。
  2. 通過分割空間,並獲得輸入
  3. 檢查每個輸入

類型.........

#include <string> 
#include <iostream> 
#include <vector> 
#include <sstream> 


std::vector<std::string> split(const std::string &s) { 
    std::stringstream ss(s); 
    std::string item; 
    std::vector<std::string> elems; 
    while (std::getline(ss, item, ' ')) { 
     elems.push_back(item); 
    } 
    return elems; 
} 

int main() 
{ 
    std::string line; 
    std::getline(std::cin, line); 
    std::vector<std::string> elems = split(line); 
    for (int i = 0; i < elems.size; i++) 
    { 
     /* 
     if is number 
      do something 
     else 
      ignore 
     */ 
    } 
}