2015-04-07 48 views
0

夥計們我正在使用C++來構建一個shell程序,這裏是我得到當前用戶名和工作地址的代碼,但是如果它包含根目錄,我想編輯它的地址,包含的部分將被替換爲「〜 「,但我不知道該怎麼做..如何查找和替換char數組內存儲的字符串?

我發現一個想法,這是一種方式左移幾個大小的pw_dir的方式..但如何做到這一點?

請幫幫我。

char hostname[32]; 
char present_addr[255]; 
struct passwd *getuser; 

void default_output() { 

getuser = getpwuid(getuid()); 
gethostname(hostname, sizeof(hostname)); 
getcwd(present_addr, sizeof(present_addr)); 

if (strcmp(present_addr, getuser->pw_dir) == 0) { 
    cout << "[CYHshell]" << getuser->pw_name << "@" << hostname << ":" << "~$ "; 
} 
else 
    cout << "[CYHshell]" << getuser->pw_name << "@" << hostname << ":" << present_addr << "$ "; 
} 

嘛,比如應該是這樣的:

/用戶/ howechen /圖書館/緩存/ clion10/cmake的/生成/ 374e429/374e429 /調試$

這是當前工作我的程序的目錄,並應固定

~/Library/Caches/clion10/cmake/generated/374e429/374e429/Debug$ 

原因

/Users/howechen/ 

是我的根目錄

+0

向我們展示一個示例輸入和所需的輸出。 – zoska

+0

移位僅適用於以字節爲單位的位。字符串不能像這樣處理(你需要使用函數族'str *') – zoska

+0

當然,我編輯了我的問題。 @zoska –

回答

0

您可以使用一個字符串變量使用它replace功能。

你必須添加一個包括:

#include <string> 

並使用一個臨時字符串變量: 炭主機名[32]; char present_addr [255]; struct passwd * getuser;

void default_output() { 

getuser = getpwuid(getuid()); 
gethostname(hostname, sizeof(hostname)); 
getcwd(present_addr, sizeof(present_addr)); 

std::string outputString = present_addr; 
outputString.replace(getuser->pw_dir, "~"); 

但是你得把數據傳回在present_addr:

for (unsigned int i=0; i<outputString.length(); i++) 
{ 
    present_addr[i] = outputString.c_str()[i]; 
} 
present_addr[i+1] = '\0'; 

memcpy(present_addr, outputString.c_str(), outputString.length()); 

我沒有把安全上present_addr [I],但它在這裏應該沒問題。

+0

非常感謝你,你的代碼是有用的,我修復了一個問題:它應該是outputString.replace(0,sizeof(getuser-> pw_dir),「〜」,0,1); –

+0

但是另一個問題是我無法通過使用sizeof()來獲得正確的pw_dir大小,你知道爲什麼嗎? –

+0

是的,我已經想通了: string present_addr_fixed = present_addr; string root_directory = getuser-> pw_dir; present_addr_fixed.replace(0,root_directory.length(),「〜」,0,1); 非常感謝 –

相關問題