2016-05-01 53 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; 
} 
相关问题