2017-07-31 7 views
-3

基本的には、文字列sに入力されたすべての数字を削除して文字列を表示しようとしています。しかし、文字列cはprint.Also 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 [L] = sのように、文字列に文字を追加する[i]は、'間違っています。最初に 'resize()'を呼び出す必要があります。 – user0042

+0

ループは1つの余分な時間を実行しています。 – CinCout

+1

@CinCout、幸いにも、文字列に関しては、 's [s.size()]'はまだ有効です。それは単にヌル文字です。 –

答えて

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

あなたはcharacters.Youがcに要素をプッシュする代わりにpush_backを使用することができ入れてcにスペースが割り当てられていません。

c.push_back(s[i]); 

それともcのために割り当てられたスペースを持っているresize()を呼び出すことができます。ループの終わりに

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

あなたがs.size()-1まであなたのループを実行する場合、\0を置くことを忘れないでください。

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

C++のアプローチのためのUpvote。 – 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; 
} 
関連する問題