2016-05-01 95 views
-5

只想知道如何從包含空格的stdin獲取字符串?我試過fgets和scanf(「%[^ \ n]」,str),但它仍然不能在C中工​​作。如何從標準輸入包含空格的字符串?

我試過程序從C++中的給定字符串中刪除空格。 這是我的代碼,但它不起作用。

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

int main() { 
    // your code goes here 
    int t; 
    cin >> t; 
    while (t--) { 
     char s[1000]; 
     cin.getline(s, 1000); 
     // cout<<s; 
     int i; 
     for (i = 0; s[i]; i++) { 
      if (s[i] != ' ') 
       s[i] = '\b'; 
     } 
     for (i = 0; s[i]; i++) 
      cout << s[i]; 
     // cout<<endl; 
    } 
    return 0; 
} 
+0

爲什麼要用''\ b''替換每個非空格字符? –

+0

'getline()'可能適合你 – Stephen

+5

在關於C的問題中顯示C++程序令人困惑。你應該真的有兩個問題 - 兩個不同的問題。一個應該是關於爲什麼你的C++不工作。另一個人應該儘可能在C程序上盡力而爲,並解釋爲什麼它不起作用。你應該可以使'fgets()'工作來讀取行,而不管行內的空白。 –

回答

0

您的代碼已在閱讀包含空格的行。這就是getline所做的。奇怪的是,雖然,你在這裏

for (i = 0; s[i]; i++) { 
    if (s[i] != ' ') 
    s[i] = '\b'; 
} 

這個循環那將會有'\b'更換所有可見的字符,這是退格字符,而不是在最終端可見。如果你刪除這個循環,你的代碼幾乎是正確的。唯一剩下的問題是,你的循環的第一次迭代,你會不會因爲這行能輸入任何東西,:

cin >> t; 

一個尾部的換行符將保持在輸入緩衝器中的第一次調用之前函數getline。在這個問題的答案中解釋了這個問題:cin.getline() is skipping an input in C++ - 和許多重複。但是,即使您沒有解決該問題,在第一行之後,getline應該按照原樣正確讀取行。

1
#include <iostream> 
#include <string> 
#include <algorithm> 

using namespace std; 

string getInput(string input) 
{ 
    getline(cin, input); 

    return input; 
} 

// Handles tabs and spaces 
string removeWhitespace(string input) 
{ 
    input.erase(remove_if(input.begin(), 
          input.end(), 
          [](char ch){ return isspace(ch); }), 
       input.end()); 

    return input; 
} 

int main() 
{ 
    cout << removeWhitespace(getInput({})) << endl; 

    return 0; 
} 
相關問題