【发布时间】:2013-08-28 04:55:20
【问题描述】:
我对 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";
}
【问题讨论】:
-
在
setarray中,打印出getline读到的每一行,验证输入是否正确。另外,std::vector有什么问题? -
使用
std::vector而不是new[],并使用参数和返回值而不是使用全局变量。 -
当我这样做时,第一次迭代不打印。假设我说数组内存分配为 5,setarray 循环只要求 4 个输入。我还不知道 std::vector 是什么。我目前正在学习并使用我学到的东西来制作一个简单的排序程序。
-
您可以直接
cin >> arraynum;而不是stringstream(mystr) >> arraynum;。除非您只是想学习如何使用stringstream,否则据我所知没有理由使用这种间接方式。 :) -
您可能还想在调试器中逐行执行代码,看看实际发生了什么。