Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
第一次迭代失败 我对C++很新,但逻辑上我认为这应该是有效的。< /P>_C++_Arrays_Loops - Fatal编程技术网

第一次迭代失败 我对C++很新,但逻辑上我认为这应该是有效的。< /P>

第一次迭代失败 我对C++很新,但逻辑上我认为这应该是有效的。< /P>,c++,arrays,loops,C++,Arrays,Loops,我有一个函数,它接受用户的输入来设置数组的内存分配: 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 setarraynum(){
  string mystr;
  cout<<"Please enter the size of your array: ";
  getline(cin, mystr);
  stringstream(mystr)>>arraynum;
  array = new int [arraynum];
  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 setarray(){
字符串mystr;
问题在于:

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

我强烈建议您直接使用
cin>>arraynum;
而不是在
stringstream(mystr)>>arraynum;
范例中读取整数

< C++ >引用>代码> GETLION<代码> < /P> 如果找到分隔符,将提取并丢弃它,即 未存储,然后将开始下一个输入操作

这就是问题所在。 正如@Vaughn所指出的,您在
setorder
函数中使用
cin>>order;
,这将在输入缓冲区中保留尾部
\n


您的代码吸取的教训是,在处理I/O问题时,请确保在相同的范例中调用函数。

我稍微修改了您的代码,它的行为符合预期。我建议您向用户指示他是否应该对输入进行定界,或者他应该如何进行定界。我宁愿使用向量而不是数组。您已经做到了不取消分配阵列—这并不重要,但可能在另一个程序中

另外,我不知道当cin已经允许您获取整数时为什么要使用getline(参见代码):

#包括
#包括
#包括
内部阵列;
int*数组;
bool-isin=false;
int输入;
字符顺序;
void insertionsortdesc(int a[]);
void insertionsortasc(int a[]);
void getarray(inta[]);
无效isinarray(int a[],int b);
void setsearch();
void setarray();
void setarraynum();
void setorder();
int main(){

std::coutIn
setarray
,打印出您通过
getline
读取的每一行,以验证输入是否正确。另外,std::vector
有什么问题?使用
std::vector
而不是
new[]
并使用参数和返回值,而不是使用全局值。当我这样做时,第一次迭代不会打印。假设我说数组内存分配为5,setarray循环只要求4个输入。我还不知道std::vector是什么。我目前正在学习并使用我学到的知识制作一个简单的排序程序。你可以
cin>>arraynum;
直接代替
stringstream(mystr)>>arraynum;
。除非您只是想学习如何使用
stringstream
,否则据我所知,没有理由使用此间接寻址。:)您可能还想在调试器中逐行检查代码,看看真正发生了什么。谢谢您。我还不希望有完美的代码,因为我才开始学习c++最近,我仍在逐渐掌握这些概念。我甚至还没有开始学习关于类的知识。这个程序只是简单地“测试”自己在过去几天所学的知识(以及学习插入排序算法)我甚至不确定你所说的去限制是什么意思:P。另外,我已经被告知向量,但我仍在学习一些我以前从未见过::运算符的基础知识。(其他语言除外)。再次感谢。不用担心。目前您使用的是空格作为分隔符。因此用户必须输入以空格分隔的整数。这没关系,但只需向用户指出。会发生什么情况,例如:当我第一次运行代码时,如果用户输入1;2;3或1,2,3…从使用角度来看,这让我感到困惑。对我来说最重要的一点是是上面的@Summer\u More…中的一个。啊,我明白了。所以只需添加诸如“separate by”之类的内容。
#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";
}
cout<<"Ascending or Descending [a/d]: ";
cin>>order;
cout<<"Please enter "<<arraynum<<" numbers:\n";
for(int n=0; n<arraynum; n++){
  getline(cin, mystr);
cout<<"Ascending or Descending [a/d]: ";
cin>>order;
string rest_of_line;
getline(cin,rest_of_line);
#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";
}