2014-03-30 47 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, '_'); 
}