如何正确替换字符串c ++中的字符?

时间:2015-10-19 22:13:06

标签: c++ string replace

#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”。当我运行条件检查false而不是true时,它会打印“_”。我不知道为什么这样做,任何人都看到我不这样做的问题? 我不被允许使用该算法。头。我也只允许在main,没有函数或导入的标题/类中工作。

5 个答案:

答案 0 :(得分:4)

对于单个字符,使用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;
}

答案 1 :(得分:1)

  
    

我的代码目前的方式是,它输出&#34; 1&#34;。当我运行条件检查false而不是true时,它会打印&#34; _&#34;

  

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

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

我认为这就是这里发生的事情。 if条件失败,因为这两个值是不同的值。因此空间不会被&#39; _&#39;。

取代

答案 2 :(得分:1)

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

  

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

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

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

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

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

答案 3 :(得分: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

答案 4 :(得分:0)

如上所述here,isspace不会返回bool。相反,它返回int,其中非零值表示true,零值表示false。你应该像这样写支票:

var get_page = function(options, callback){

request_wrapper(c_url(options), function(xml){

    parseString(xml, function (err, result) {

        if(result["feed"]["entry"] != undefined){

            async.eachSeries(result["feed"]["entry"], function(entry, iter) {

                total_entries++;
                iter();

            },function(){
                options.start = total_entries;
                get_page(options, function(){
                });
            });

        }else{ 
            // But this shows.
            console.log("TOTAL ENTRIES HERE: "+total_entries);   
        }

        callback({}); // Does this work ?

    });
});