2014-03-30 51 views
0

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

我如何才能在年底摆脱那些字符?

+6

使用'的std :: replace'。 – chris

+0

问题措辞严重:描述中提到“填充到15个字符”,但标题是“用下划线替换空格”。 – Mark

+0

谢谢克里斯,我不知道有一个替换函数我可以使用,以便照顾替换空的空间。但是,如果用户名长度小于15个字符,如何追加一定数量的空白空间? – Dreadlock

回答

2

构造函数string::string(char *)需要一个以null结尾的字符串。 arr不是空终止的,所以构造函数离开数组的末尾,并保持从内存中追加随机垃圾,直到它找到一个值为'0'的字节。

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

+0

你可能还需要为OP解释一下_'null-terminated string'_意味着什么。 –

0

更好的方法是使用其中一个附加功能std::basic_string::append

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

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

string spaces (int i) 

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

0

我能够通过使用解决了下列文件:

谢谢。

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

的功能,可以看下面的方式

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