2013-08-28 162 views
0

我對C++相當陌生,但邏輯上我認爲這應該起作用。第一次迭代失敗

我有一個函數,它接受來自用戶的輸入來設置所述存儲器分配的數組:

void setarraynum(){ 
    string mystr; 
    cout<<"Please enter the size of your array: "; 
    getline(cin, mystr); 
    stringstream(mystr)>>arraynum; 
    array = new int [arraynum]; 
    cout<<"\n"; 
} 

arraynum和陣列全局設定爲:

int arraynum; 
int * array; 

我然後有一個功能需要陣列輸入:

void setarray(){ 
    string mystr; 
    cout<<"Please enter "<<arraynum<<" numbers:\n"; 
    for(int n=0; n<arraynum; n++){ 
    getline(cin, mystr); 
    stringstream(mystr)>>array[n]; 
    }; 
cout<<"\n"; 
} 

問題出現在進入th e數組中,數組的第一個實例(array [0])自動設置爲0.如同循環迭代第一次迭代而不要求用戶輸入。然後繼續詢問用戶是否正常。

任何想法?

謝謝。

*編輯(按照要求,該代碼的全部):

#include <iostream> 
#include <sstream> 
#include <string> 
using namespace std; 

int arraynum; 
int * array; 
bool isin = false; 
int input; 
char order; 

void insertionsortdesc(int a[]); 
void insertionsortasc(int a[]); 
void getarray(int a[]); 
void isinarray(int a[], int b); 

void setsearch(); 
void setarray(); 
void setarraynum(); 
void setorder(); 

int main(){ 

cout<<"\n//// INPUT ////\n\n"; 

setarraynum(); 
setorder(); 
setarray(); 
setsearch(); 

if(order=='a'){insertionsortasc(array); 
}else if(order=='d'){insertionsortdesc(array);}; 

cout<<"//// OUTPUT ////\n\n"; 
getarray(array); 
isinarray(array, input); 

return 0; 
} 

void setorder(){ 
bool isvalid = false; 

while(!isvalid){ 
    cout<<"Ascending or Descending [a/d]: "; 
    cin>>order; 
    if(order=='a'||order=='d'){isvalid = true; 
    }else{cout<<"Please enter a valid option!\n";}; 
}; 

cout<<"\n"; 
} 

void setarraynum(){ 
string mystr; 
cout<<"Please enter the size of your array: "; 
getline(cin, mystr); 
stringstream(mystr)>>arraynum; 
array = new int [arraynum]; 
cout<<"\n"; 
} 

void setsearch(){ 
string mystr; 
cout<<"Search for (int): "; 
getline(cin, mystr); 
stringstream(mystr)>>input; 
cout<<"\n"; 
} 

void setarray(){ 
string mystr; 
cout<<"Please enter "<<arraynum<<" numbers:\n"; 
for(int n=0; n<arraynum; n++){ 
    getline(cin, mystr); 
    stringstream(mystr)>>array[n]; 
}; 
cout<<"\n"; 
} 

void insertionsortdesc(int a[]){ 
for(int n=1; n<arraynum; n++){ 
    int key = a[n]; 
    int j = n-1; 
    while((j>=0)&&(a[j]<key)){ 
    a[j+1] = a[j]; 
    j -= 1; 
    }; 
    a[j+1]=key; 
} 
} 

void insertionsortasc(int a[]){ 
for(int n=1; n<arraynum; n++){ 
    int key = a[n]; 
    int j = n-1; 
    while((j>=0)&&(a[j]>key)){ 
    a[j+1] = a[j]; 
    j -= 1; 
    }; 
    a[j+1]=key; 
} 
} 

void isinarray(int a[], int b){ 
for(int n=0; n<arraynum; n++){ 
    if(a[n] == b){ 
    isin = true; 
    break; 
    }; 
}; 

if(isin){ 
    cout<<b<<" is present in the given array."; 
}else{ 
    cout<<b<<" is not present in the given array."; 
}; 

cout<<"\n\n"; 
} 

void getarray(int a[]){ 
cout<<"Sorted array sequence: "; 
for(int n=0; n<arraynum; n++){ 
    cout<<a[n]<<", "; 
}; 
cout<<"\n\n"; 
} 
+0

在'setarray',打印出每次用'getline'讀線,以驗證輸入是否正確。另外,'std :: vector'有什麼問題? –

+1

使用'std :: vector'而不是'new []'並使用參數並返回值而不是使用全局變量。 – chris

+0

當我這樣做時,第一次迭代不打印。說我說數組內存分配爲5,setarray循環只要求4個輸入。我不知道std :: vector是什麼。我目前正在學習和使用我所學的知識來製作一個簡單的排序程序。 –

回答

1

我強烈建議你使用cin >> arraynum;,而不是直接讀入stringstream(mystr) >> arraynum;範式的整數。

從C++參考http://www.cplusplus.com/reference/string/string/getline/getline

如果定界符被發現,它被提取並丟棄,即,它是 不存儲和之後的下一個輸入操作將開始。

所以這就是問題所在。 正如@Vaughn所指出的那樣,您在setorder函數中使用cin >> order;函數,該函數將在輸入緩衝區中留下尾號\n

您的代碼學到的教訓是解決I/O問題時,確保函數在相同的範例中調用。

1

問題就在這裏:

cout<<"Ascending or Descending [a/d]: "; 
cin>>order; 

你正在閱讀的 'a' 或 'd',但不回車。

當你到這裏:

cout<<"Please enter "<<arraynum<<" numbers:\n"; 
for(int n=0; n<arraynum; n++){ 
    getline(cin, mystr); 

getline將會把任何你的「a」或「d」和回車因爲它獲得前行後輸入 - 可能是空白。

一個解決這個問題的辦法是閱讀order後添加另一個getline

cout<<"Ascending or Descending [a/d]: "; 
cin>>order; 
string rest_of_line; 
getline(cin,rest_of_line); 
0

我已經稍微修改了你的代碼,它的行爲和預期的一樣。我建議你向用戶指出他是應該劃定他的輸入,還是應該劃定界限。我寧願使用矢量而不是數組。你已經沒有取消你的數組的分配 - 這並不重要,但它可能在另一個程序中。

另外,我不知道爲什麼你使用函數getline當CIN已經可以讓你獲得整數(見代碼):

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

int arraynum; 
int * array; 
bool isin = false; 
int input; 
char order; 

void insertionsortdesc(int a[]); 
void insertionsortasc(int a[]); 
void getarray(int a[]); 
void isinarray(int a[], int b); 

void setsearch(); 
void setarray(); 
void setarraynum(); 
void setorder(); 

int main(){ 

std::cout<<"\n//// INPUT ////\n\n"; 

setarraynum(); 
setorder(); 
setarray(); 
setsearch(); 

if(order=='a'){insertionsortasc(array); 
}else if(order=='d'){insertionsortdesc(array);}; 

std::cout<<"//// OUTPUT ////\n\n"; 
getarray(array); 
isinarray(array, input); 

return 0; 
} 

void setorder(){ 
bool isvalid = false; 

while(!isvalid){ 
    std::cout<<"Ascending or Descending [a/d]: "; 
    std::cin>>order; 
    if(order=='a'||order=='d'){isvalid = true; 
    }else{std::cout<<"Please enter a valid option!\n";}; 
}; 

std::cout<<"\n"; 
} 

void setarraynum(){ 
std::cout<<"Please enter the size of your array: "; 
while(!(std::cin >> arraynum)) 
{ 
    std::cout << "Please enter integer!"; 
} 
array = new int [arraynum]; 
std::cout<<"\n"; 
} 

void setsearch(){ 
std::cout<<"Search for (int): "; 
while(!(std::cin >> input)) 
{ 
    std::cout << "Please enter integer!" << std::endl; 
} 
std::cout<<"\n"; 
} 

void setarray(){ 
std::ostringstream msgStream; 
msgStream << "Please enter "<<arraynum<<" numbers:"; 
std::cout << msgStream.str() << std::endl; 

for(int n=0; n<arraynum; n++){ 
    if(!(std::cin >> array[n])){ 
    n = 0; 
    std::cout << msgStream.str() << std::endl; 
    } 
} 
std::cout<<"\n"; 
} 

void insertionsortdesc(int a[]){ 
for(int n=1; n<arraynum; n++){ 
    int key = a[n]; 
    int j = n-1; 
    while((j>=0)&&(a[j]<key)){ 
    a[j+1] = a[j]; 
    j -= 1; 
    }; 
    a[j+1]=key; 
} 
} 

void insertionsortasc(int a[]){ 
for(int n=1; n<arraynum; n++){ 
    int key = a[n]; 
    int j = n-1; 
    while((j>=0)&&(a[j]>key)){ 
    a[j+1] = a[j]; 
    j -= 1; 
    }; 
    a[j+1]=key; 
} 
} 

void isinarray(int a[], int b){ 
for(int n=0; n<arraynum; n++){ 
    if(a[n] == b){ 
    isin = true; 
    break; 
    }; 
}; 

if(isin){ 
    std::cout<<b<<" is present in the given array."; 
}else{ 
    std::cout<<b<<" is not present in the given array."; 
}; 

std::cout<<"\n\n"; 
} 

void getarray(int a[]){ 
std::cout<<"Sorted array sequence: "; 
for(int n=0; n<arraynum; n++){ 
    std::cout<<a[n]<<", "; 
}; 
std::cout<<"\n\n"; 
} 
+0

謝謝你。我並沒有期待完美的代碼,因爲我最近纔開始學習C++,而且我仍然掌握了這些概念。我甚至還沒有開始學習課程。這個程序只是爲了測試我自己在過去幾天學到的知識(以及學習插入排序算法)。我甚至不確定自己是什麼意思,通過解除限制:P。另外,我已經被告知了矢量,但是我仍然在學習我以前從未見過::運算符的基礎知識。 (除了其他語言)。再次感謝。 –

+0

沒有汗水。目前您正在使用空格作爲分隔符。因此用戶必須輸入由空格分隔的整數。這是好的,但只是向用戶指出。會發生什麼,例如:如果用戶輸入1; 2; 3或1,2,3 ...當我第一次運行代碼時,它從使用的角度來看我感到困惑。對我來說最重要的一點是@Summer_More ...上面的這個。 –

+0

啊我明白了。那麼只需添加諸如「由分開?」。 –