如何将" "替换为"_"?

How do I replace " " with "_"?

本文关键字:替换      更新时间:2023-10-16

我有一个输入字符串。如果字符串包含空格或长度小于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�

如何去掉结尾的那些字符?

string::string(char *)构造函数期望一个以空结尾的字符串。arr不是以空结束的,因此构造函数从数组的末尾走出去,并继续从内存中添加随机垃圾,直到找到一个值为'0'的字节。

如果您想使用此方法用下划线填充字符串,您应该使arr比所需的下划线数量大一个字符,并将最后一个位置设置为值''

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

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

类似地,使用std::string::replace函数将所有用户输入的空格替换为下划线。

string spaces (int i)

函数不再需要(解决了Mark列出的未终止数组的问题)。

我可以用下面的方法解决它:

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

谢谢。

这个任务可以分两步完成。首先,您应该将原始字符串中的所有空格替换为非编码。例如

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也不是null终止。因此,调用构造函数string space(arr);具有未定义的行为。

函数可以如下所示

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