【问题标题】:How to correctly replace a character in a string c++?如何正确替换字符串c ++中的字符?
【发布时间】:2016-01-18 09:58:37
【问题描述】:
#include <iostream>
#include <string>
#include <cctype>
using namespace std;

int main() {
string passCode;

passCode = "1 ";
int i;

for(i =0; i < passCode.length();i++){
if(isspace(passCode.at(i)) == true){

passCode.replace(i,1,"_");

}

}
cout << passCode << endl;
return 0;
}

上面的代码,我的指示是[将 2 字符字符串 passCode 中的任何空格 ' ' 替换为 '_'。如果不存在空格,则程序不应打印任何内容。]

我的代码目前是这样,它输出“1”。当我在条件检查为假而不是真的情况下运行它时,它会打印“_”。我不明白为什么要这样做,有人看到我没有看到的问题吗? 我不允许使用该算法。标题。我也只能在 main 中工作,不能在函数或导入的头文件/类中工作。

【问题讨论】:

    标签: c++ string replace


    【解决方案1】:

    您也可以使用std::string::find 控制的while 循环并用std::string::replace 替换空格来执行此操作。

    std::string test = "this is a test string with spaces ";
    std::size_t pos = 0;
    while ((pos = test.find(' ', pos)) != std::string::npos)
    {
        test.replace(pos, 1, "_");
        pos++;
    }
    std::cout << test;
    

    Live Example

    【讨论】:

      【解决方案2】:

      here 所述,isspace 不返回布尔值。相反,它返回 int,其中非零值表示真,零值表示假。你应该这样写支票:

      if (isspace(passCode.at(i)) != 0)
      

      【讨论】:

      • 我明白了,这就是向我解释的方式: true if whitespace isspace(' ') // true isspace('\n') // true isspace('x') // false难怪它不起作用。非常感谢
      • @Flower 在 if/while 和其他条件语句在 C/C++ 中如何工作的上下文中,非零值被假定为 TRUE,并且值等于零- 是错误的。所以,从技术上讲,你甚至可以这样写你的 if:if (isspace(passCode.at(i)))。
      • 请注意,这不仅仅是“替换任何空格' '”。
      【解决方案3】:

      您的问题是您对isspace 的使用。如果您阅读the documentation for isspace,它会说:

      返回值
      如果确实 c 是空白字符,则该值不同于零(即 true)。否则为零(即假)。

      但是,您只检查它是否返回 truefalse。你的编译器应该警告你不匹配,因为isspace 返回一个int,而你正在检查bool

      更改为以下代码应该适合您:

      if(isspace(passCode.at(i)) != 0) {
          passCode.replace(i,1,"_");
      }
      

      我的回答更具体地基于您的问题和您的评论,即除了您所包含的内容之外,您不能使用任何标题。 answered by juanchopanza 是一个更好的解决方案,您应该尽可能地使用标准库,而不是编写自己的代码。

      【讨论】:

        【解决方案4】:

        我的代码目前是这样,它输出“1”。当我使用条件检查 false 而不是 true 运行它时,它会打印“_”

        isspace 在传递一个空格时返回一个非零值。这不一定是 1。 另一方面,布尔值 true 通常设置为 1。

        当我们将 isspace 的返回值与 true 进行比较时,当它们不完全相等时会发生什么? 具体来说,如果 true 为 1 并且 isspace 只返回一些非零值怎么办?

        我认为这就是这里正在发生的事情。 if 条件失败,因为这两个是不同的值。所以空格不会被'_'取代。

        【讨论】:

        • 是的,在我的程序中,它正在评估一些积极的价值,感谢您的帮助。
        【解决方案5】:

        对于单个字符,使用std::replace 算法可能更容易:

        std::replace(passCode.begin(), passCode.end(), ' ', '_');
        

        如果您不能使用算法标头,您可以推出自己的 replace 函数。可以通过一个简单的循环来完成:

        template<typename Iterator, typename T>
        void replace(Iterator begin, Iterator end, const T& old_val, const T& new_val)
        {
            for (; begin != end; ++begin)
                if (*begin == old_val) *begin = new_val;
        }
        

        【讨论】:

        • 我认为replace_if + isspace 可能更适合这里。它也用于 OP 的代码中。
        • @cad 说明说“将任何空格 ' ' 替换为 '_' ”,因此使用 isspace 会做得更多。
        • 这不行,它说replace不是std的成员::
        • @Flower 如果您阅读链接中的文档并包含所需的标题,它会起作用。
        • @Flower 请停止浪费人们的时间。如果您有荒谬的限制,应该在您的问题中很好地解释它们。 std::string 是模板的 typedef,所以你已经违反了自己的规则。
        猜你喜欢
        • 1970-01-01
        • 2011-10-20
        • 1970-01-01
        • 2018-04-09
        • 2014-07-30
        • 1970-01-01
        • 2012-04-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多