我对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和array是全局变量设置为:
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";
}
当输入数组时会出现问题,数组的第一个实例(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 :(得分: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'之后以及回车之前输入的任何内容对待它所获得的行 - 可能是空白的。
解决问题的一种方法是在阅读getline
后添加另一个order
:
cout<<"Ascending or Descending [a/d]: ";
cin>>order;
string rest_of_line;
getline(cin,rest_of_line);
答案 1 :(得分:1)
我强烈建议您直接使用cin >> arraynum;
,而不是在stringstream(mystr) >> arraynum;
范例中读取整数。
来自getline
如果找到分隔符,则将其提取并丢弃,即它 没有存储,下一个输入操作将在它之后开始。
所以这就是问题所在。
正如@Vaughn指出的那样,你在cin >> order;
函数中使用了setorder
,这将使尾部\n
留在输入缓冲区中。
您的代码所学到的经验教训是在解决I / O问题时,确保在相同的范例中调用函数。
答案 2 :(得分:0)
我稍微修改了你的代码,它的行为符合预期。我建议你向用户表明他是否应该划分他的输入,或者他应该如何划界。我宁愿使用矢量而不是数组。你已经没有取消分配你的数组 - 不重要,但它可能在另一个程序中。
另外,我不知道你为什么在cin已经允许你得到整数时使用getline(参见代码):
#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";
}