【问题标题】:Program not exiting when exit conditions met?满足退出条件时程序不退出?
【发布时间】: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::stringchar * 混合在一起......这可能是问题,也可能不是问题。
  • 您应该使用所有警告和调试信息 (g++ -Wall -Wextra -g) 进行编译,然后使用调试器 (gdb)
  • @MatsPetersson 您能否详细说明以不必要的方式将 std::string 与 char * 混合...?我主要来自使用java,我想要一些指针......关于指针
  • 嗯,通常(在我看来),C++ 几乎没有理由使用char* 进行字符串处理。如果你将 C 风格的字符串传递给 API,当然可以——但这只需要 std::string::c_str [这就是该函数的全部意义!]

标签: c++ shell unix


【解决方案1】:

正如 Mats 所建议的,最好避免使用 char* 并坚持使用字符串。

这是一个示例代码,它与您执行相同的操作并使用字符串。

以下函数将在每个 char delim(例如空格)处拆分一个字符串,并用生成的片段填充 elems。我是从这里https://stackoverflow.com/a/236803/75517获得的。

std::vector<std::string> &split(const std::string &s, char delim, std::vector<std::string> &elems) 
{
    elems.clear();
    std::stringstream ss(s);
    std::string item;
    while(std::getline(ss, item, delim)) 
        elems.push_back(item);
    return elems;
}

这将是您在用户提供的输入字符串上循环的主要代码。

std::string inputStr;
std::vector<std::string> args;

for(;;)
{
    std::getline(std::cin, inputStr);
    if(inputStr == "exit")
       break;
    split(inputStr, ' ', args);
    ...
}

【讨论】:

  • 感谢您的意见,非常感谢。我想我将不得不不幸地离开我在这里拥有的东西,并将其作为一个教训。在主要的代码块中(显然没有在这里发布)我使用 istringstream 将字符串传递给 args。这个项目来自的书给出了使用 char* 的例子,这就是为什么它最初被扔在这里的原因。
  • 好的。您显示的代码对我来说是正确的。问题出在其他地方。
  • 再次感谢,我已经缩小了范围,问题被困在 wait() 调用上。我创建了一个新线程。 stackoverflow.com/questions/28713400/program-stuck-on-wait
猜你喜欢
  • 1970-01-01
  • 2014-01-18
  • 1970-01-01
  • 2023-01-12
  • 2017-05-07
  • 1970-01-01
  • 2021-08-22
  • 2012-05-04
  • 2021-11-18
相关资源
最近更新 更多