2017-07-31 55 views
-3

基本上,我试图通过消除在字符串s中输入的所有数字来打印字符串。但字符串c不打印。另外c.empty()给出了一个真正的值。为什么会发生这种情况,以及如何解决?在C++中初始化字符串很重要吗?

#include<iostream> 
#include<string> 
#include<cctype> 
using namespace std; 
int main() 
{ 
    string s; 
    string c; 
    getline(cin,s); 
    int l=0; 
    for(decltype(s.size()) i=0;i<=s.size();i++) 
    { 
     if(!isdigit(s[i])) 
     { 
      c[l]=s[i];  
      l+=1; 
     } 
    } 
    cout<<c<<endl;   //no visible output 
    cout<<c.empty();  //this prints 1 
    return 0; 
} 
+0

'C [1] = S [I];'是错误的。你需要先调用'resize()'。 – user0042

+0

循环运行一次额外的时间。 – CinCout

+1

@CinCout,幸运的是,当涉及到字符串时,s [size()]仍然有效。它只是空字符。 –

回答

0
string c; //An empty string 
... 
if(!isdigit(s[i])) 
     { 
      c[l]=s[i]; 

您还没有c分配空间把characters.You可以使用push_back反推元素融入c

c.push_back(s[i]); 

或者您可以拨打resize()有分配c空间。

c.resize(s.length()); 
... 
c[l]=s[i];  
l+=1; 

在循环结束时,不要忘了把\0,如果你运行你的循环,直到s.size()-1

c[l]='\0'; 
4

其他评论员已经解释了哪里出了问题,但是你也有一个更简单的方法来删除C++中的数字!

#include <iostream> 
#include <algorithm> 

int main() 
{ 
    std::string s = "abc 123 abc 123 abc 123"; 
    std::cout << "Original: " << s << std::endl; 
    s.erase(std::remove_if(s.begin(), s.end(), 
          [](char ch) { return std::isdigit(ch); }), 
      s.end()); 
    std::cout << "Without Digits: " << s << '\n'; 
} 
+0

Upvote for C++方法。 – CinCout

+0

另一个用于利用标准库的+1。虽然指出你是在过滤原始字符串而不是在问题中创建新的过滤字符串(我正在考虑'copy_if'和'back_inserter'),这可能是一个好主意,并且它取决于你想要的变体的上下文。 – besc

+0

考虑到OP在C++中的流畅性,尽管标准库的优雅和所有这些,但我不明白这很简单。 –

0

使用operator+=到炭附加到字符串,如

#include<iostream> 
#include<string> 
#include<cctype> 
using namespace std; 
int main() 
{ 
    string s; 
    string c; 
    getline(cin,s); 
    int l=0; 
    for(decltype(s.size()) i=0;i<=s.size();i++) 
    { 
     if(!isdigit(s[i])) 
     { 
      //Use this 
      c+=s[i]; 
     } 
    } 
    cout<<c<<endl;   //no visible output 
    cout<<c.empty();  //this prints 1 
    return 0; 
}