2014-04-06 47 views
1

我想从用户那里得到一个输入,并对该输入进行冒泡排序然后输出结果。我的代码:如何使用其他值对空格进行冒泡排序?

#include<iostream> 
    using namespace std; 
    class bubble 
    { 
    public : 

     string arr[20]; 

     //Number of elements in array 
     int n; 

     //Function to accept array elements 
     void read() 
     { 
      while(1) 
      { 
       cout<<"\nEnter the number of elements in the array:"; 
       cin>>n; 
       if(n<=20) 

        break; 
       else 
        cout<<"\n Array can have maximum 20 elements \n"; 
      } 
      //display the header 
      cout<<"\n"; 
      cout<<"----------------------\n"; 
      cout<<"Enter array elements \n"; 
      cout<<"----------------------\n"; 

      //Get array elements 
      for(int i=0; i<n ;i++) 
      { 
       cout<<"<"<<i+1<<"> "; 
       cin>>arr[i]; 
      } 
     } 
     //Bubble sort function 
     void bubblesort() 
     { 
      for(int i=1;i<n ;i++)//for n-1 passes 
      { 
       //In pass i,compare the first n-i elements 
       //with their next elements 
       for(int j=0; j<n-1; j++) 
       { 
        if(arr[j] > arr[j+1]) 
        { 
         string temp; 
         temp = arr[j]; 
         arr[j] = arr[j+1]; 
         arr[j+1] = temp; 

        } 

       } 
      } 
     } 
     void display() 
     { 
      cout<<endl; 
      cout<<"----------------------\n"; 
      cout<<"Sorted array elements \n"; 
      cout<<"----------------------\n"; 
      for(int j=0; j<n; j++) 
       cout<<arr[j]<<endl; 
     } 
}; 
int main() 
{ 
    //Instantiate an instance of class 
    bubble list; 
    // Function call to accept array elements 
    list.read(); 
    // Function call to sort array 
    list.bubblesort(); 
    //Function call to display the sorted array 
    list.display(); 
    return 0; 
} 

代码运行良好,但它不接受字符串中的空格或缩进值作为输入。有没有办法让它接受这些值?

+0

'cin'被标记化的,这意味着它根据一组定界符的分裂输入。这些分隔符默认为空格。 – maddin45

回答

1

更换>>std::getline,它可以让你读取包含空格的字符串:

// Extract the \n that's left from entering n 
getline(cin, arr[0]); // We'll read it again in the loop 
for(int i=0; i<n ;i++) 
{ 
    cout<<"<"<<i+1<<"> "; 
    getline(cin, arr[i]); 
} 
+0

现在感谢它读取空格,但不知何故,它忽略要求的第一个值和跳转要求第二个值 – user3467152

+0

@ user3467152这是因为“剩余”''\ n''输入'n'的值。看看修复的修改。 – dasblinkenlight

1

使用std::getlinestd::vector<std::string>。只要用户不输入空行,就可以读取行。

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

int main() 
{ 
    std::vector<std::string> strings; 

    std::string line; 
    bool user_wants_to_quit = false; 
    while (!user_wants_to_quit && std::getline(std::cin, line)) 
    { 
     if (!line.empty()) 
     { 
      strings.push_back(line); 
     } 
     else 
     { 
      user_wants_to_quit = true; 
     } 
    } 

    std::cout << "Lines:\n"; 
    for (std::vector<std::string>::const_iterator iter = strings.begin(); iter != strings.end(); ++iter) 
    { 
     std::cout << *iter << "\n"; 
    } 
} 
+0

我喜欢你避开'break'的方式,' –

0

可以使用std::getline从流中读出所有令牌:

//Get array elements 
getline(cin, arr[0]); 
for(int i = 0; i < n ; ++i) 
{ 
    cout << "<" << i+1 << "> "; 
    getline(cin, arr[ i]); 
} 
+0

现在它读取空格,但不知何故它忽略要求第一个值和跳转要求第二个值 – user3467152

+0

@ user3467152这是因为首先我们需要读取剩余的'\ n'从以前的阅读 – 4pie0