2016-05-01 10 views
-5

空白を含むstdinから文字列を取得する方法を知りたいだけですか?私はfgetsとscanf( "%[^ \ n]"、str)を試しましたが、C言語ではまだ動作しません。空白を含むstdinから文字列を入力する方法は?

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++プログラムを表示するのは混乱します。実際には2つの質問があります。 1つはあなたのC++がなぜ機能していないのかということです。もう1つは、Cプログラムで最善の努力を示し、なぜ機能していないのかを説明する必要があります。 'fgets()'は、行内の空白に関係なく行を読み上げるようにすることができます。 –

答えて

0

あなたのコードは既に行をスペースで読み込んでいます。それがgetlineのやり方です。不思議なことに、しかし、あなたは、バックスペース文字であり、ほとんどの端末に表示されていない、'\b'ですべての可視文字を置き換えるために起こってここに

for (i = 0; s[i]; i++) { 
    if (s[i] != ' ') 
    s[i] = '\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; 
} 
関連する問題