【问题标题】:is it important to initialize strings in c++?在 C++ 中初始化字符串很重要吗?
【发布时间】:2017-07-31 06:01:41
【问题描述】:

基本上,我试图通过消除在字符串 s 中输入的所有数字来打印字符串。但是字符串 c 不打印。而且 c.empty() 给出了一个真值。为什么会发生这种情况以及如何解决?

#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;
}

【问题讨论】:

  • c[l]=s[i]; 是错误的。您需要先致电resize()
  • 循环再运行一次。
  • @CinCout,幸运的是,当涉及到字符串时,s[s.size()] 仍然有效。它只是一个空字符。
  • @RSahu 有道理。但是在循环结束后,'\0' 不会自动附加到c 的末尾(假设用户正确地为c 进行了内存管理)?我知道手动添加空字符并没有什么坏处。
  • @CinCout,不,它不会自动发生。

标签: c++ stdstring


【解决方案1】:

其他评论员已经解释了哪里出了问题,但您也有一种更简单的方法来删除 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';
}

【讨论】:

  • 另一个 +1 用于利用标准库。尽管指出您正在过滤原始字符串而不是像问题中那样创建新的过滤字符串可能是一个好主意(我在想copy_ifback_inserter),这取决于你想要的变体的上下文。
  • 尽管标准库和所有这些都很优雅,但考虑到 OP 在 C++ 中的流畅性,我看不出这有多简单。
  • 我理解这通常是如何工作的。谁能解释一下 [ ](char ch) 的工作原理吗?
  • @AritraBan 这是声明 lambda / 匿名函数的语法:[] 表示我们不应该有任何变量,(char ch) 是一个函数签名,表示我们接受单个参数:一个变量ch 类型为 char。我相信您也可以将整个 lambda 函数替换为 isdigit
【解决方案2】:
string c; //An empty string
...
if(!isdigit(s[i]))
        {
            c[l]=s[i];

您没有在c 中分配空间来放置字符。您可以使用push_back 代替将元素推送到c

c.push_back(s[i]);

或者您可以调用resize()c 分配空间。

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

如果您将循环运行到s.size()-1,请不要忘记在循环结束时添加\0

c[l]='\0';

【讨论】:

    【解决方案3】:

    使用 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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-03
      • 2022-01-16
      相关资源
      最近更新 更多