【发布时间】:2015-02-24 18:23:13
【问题描述】:
我正在用 c++ 编写一个 shell 项目。我需要的所有功能都在那里。然而,有一个问题。我的退出条件是用户输入“退出”,除非前面的命令是随机字符串(例如:asldjkf),否则它工作正常。当输入一个随机字符串,然后在下一个提示符处输入 exit 时,它会再次循环,然后在用户再次输入“exit”时退出。
我刚刚使用 cout 进行了调试,我知道退出的条件已经满足。谁能告诉我这里会发生什么?`
这是我在 main() 中调用的内容
UNIX_shell myShell;
char * args[100];
string check = "";
argsIndex = 0;
string userIn;
while(myShell.exitstatus == false)
{
std::cin.getline(myShell.userIn, 256);
check = string(myShell.userIn);
cout << check << endl;
myShell.getArgs(check, args);
if(myShell.exitstatus == false && string(myShell.userIn) != "exit")
cout << myShell.userName + "@" + myShell.hostName + ":~" + getcwd(NULL, 0) + "/";
}
return 0;
这里是调用 getArgs() 后立即满足退出条件的地方:
void UNIX_shell::getArgs(string check, char * args[])
{
cout << "check is" << check << endl;
if(check[0] == 'e' && check[1] == 'x' && check[2] == 'i' && check[3] == 't')
{
cout << "shadoom" << endl;
this->exitstatus = true;
cout << "exit = "<< exitstatus << endl;
return;
}
...
因此,如果我运行我的程序并输入类似 ls 或 ps -aef 的内容,然后键入 exit,一切运行正常,然后程序退出。
但是如果我运行我的程序,在命令行中输入“shit”,然后在下一个提示符下输入“exit”,我会得到第二个提示,然后当我再次输入 exit 时,它会退出。我已经尝试调试了一个多小时。感谢您提前提供任何帮助。
【问题讨论】:
-
您的代码看起来不像实际编译 - 您是否只是将各种属于同一类的位复制并粘贴在一起,但实际上不是程序吗?您似乎以不必要的方式将
std::string与char *混合在一起......这可能是问题,也可能不是问题。 -
您应该使用所有警告和调试信息 (
g++ -Wall -Wextra -g) 进行编译,然后使用调试器 (gdb) -
@MatsPetersson 您能否详细说明以不必要的方式将 std::string 与 char * 混合...?我主要来自使用java,我想要一些指针......关于指针
-
嗯,通常(在我看来),C++ 几乎没有理由使用
char*进行字符串处理。如果你将 C 风格的字符串传递给 API,当然可以——但这只需要std::string::c_str[这就是该函数的全部意义!]