如何用“_”替换“”?

时间:2014-03-30 20:23:02

标签: c++ string

所以我有一个输入字符串。如果字符串包含空格或长度少于15个字符,我必须用下划线(“_”)替换空格。

这是我的代码:

#include <string>
#include <iostream>

using namespace std;

string spaces(int i){
        char arr[i];
        for(int j=0; j<i; j++){
         arr[j]='_';
        }
        string space(arr);
        return space;
} 

int main(){
        string str = "USERNAME12034";
        if(str.size() < 15){
        // get size of username;
        int size = 15-str.size();
        str = str.append(spaces(size));
        }
        cout << str << endl;

        return 0;
}

当我编译并运行它时,这是输出:

 USERNAME12034__�O�

如何在最后摆脱这些角色?

4 个答案:

答案 0 :(得分:2)

string::string(char *)构造函数需要以null结尾的字符串。 arr不是以空值终止的,因此构造函数从数组的末尾开始,并继续从内存中追加随机垃圾,直到找到值为“0”的字节。

如果要使用此方法填充带下划线的字符串,则应使arr个字符大于所需的下划线数,并将最后一个字符设置为值'\0'。< / p>

答案 1 :(得分:0)

更好的方法是使用其中一个追加函数std::basic_string::append

可以在循环内部使用std::string::push_back来添加下划线,直到长度为15(或者必须强制执行任何限制)。

同样,使用std::string::replace函数用下划线替换所有用户输入的空格。

string spaces (int i)
不再需要

功能(解决Mark列出的非终止阵列问题)。

答案 2 :(得分:0)

我能够通过以下方式解决它:

string addUnderscore(string text, int size){
   text = text.append(size, ' ');
   for(int i = 0; i < text.length(); i++)
   {
      if(text[i] == ' ')
      text[i] = '_';
   }
   return text;
}

谢谢。

答案 3 :(得分:0)

任务可以分两步完成。首先,您应该在原始字符串中替换所有带有不受欢迎的空格。例如

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

然后你应该检查字符串的大小是否小于15,如果是,那么用下划线附加字符串

if ( str.size() < 15 ) str.resize( 15, '_' );

结合这两个陈述你会得到

#include <algorithm>
#include <string>

//...

std::replace( str.begin(), str.end(), ' ', '_' );
if ( str.size() < 15 ) str.resize( 15, '_' );

至于你的功能,那就错了。首先,它不符合C ++。在C ++中,没有可变长度数组。所以你可能不会写

string spaces(int i){
        char arr[i];
        //...
}

此外,数组arr不会以空值终止。因此,构造函数string space(arr);的调用具有未定义的行为。

该功能可以采用以下方式

void format( std::string &str )
{
    std::replace( str.begin(), str.end(), ' ', '_' );
    if ( str.size() < 15 ) str.resize( 15, '_' );
}