伙计我正在使用c ++构建一个shell程序,这里是我获得当前用户名和工作地址的代码,但我想编辑地址,如果它包含根目录,则包含部分将被替换为& #34;〜",但我不知道该怎么做..
我发现了一个想法,就像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 << "$ ";
}
嗯,示例应该是这样的:
/ Users / howechen / Library / Caches / clion10 / cmake / generated / 374e429 / 374e429 / Debug $
这是我程序的当前工作目录,应该修复为
~/Library/Caches/clion10/cmake/generated/374e429/374e429/Debug$
原因
/Users/howechen/
是我的根目录
答案 0 :(得分:0)
您可以使用字符串变量来使用其replace函数。
您必须添加一个包含:
#include <string>
并使用临时字符串变量: 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));
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]上设置安全性,但这里应该没问题。