C ++无法用键盘输入

时间:2014-12-05 20:14:21

标签: loops c++11

如果未输入“密码”,则代码会询问用户的姓名。如果找到该名称,则会将其名字指定为用户。

代码打击是较大版本的简化版本,但问题完全相同。在else if语句中,std::cout << "Hello " << FirstName << std::endl;无限重复。如果我删除std::cout << "Hello " << FirstName << std::endl;我无法输入任何内容。好像我的键盘被拔掉了。尝试使用goto,case,甚至用它来创建一个函数,但问题仍然存在。有什么想法吗?

#include <fstream>
#include <iostream>
#include <string>

int main() 
{
std::string User;
std::string text;
std::string PassWord;
std::cin >> PassWord;
    if(PassWord == "password")
    {
        User = "Ryan";
    }
    else if (PassWord != "password")
    {
        std::string line;
        std::string LastName;
        std::string FirstName;
        std::string AttemptUser;
        std::ifstream NameFile;
        int offset; 

        std::cout << "Name?" << std::endl; 
        NameFile.open("C:\\Filepath\\Names.txt");

        if(NameFile.is_open())
        {
            while(!NameFile.eof())
            {
                while(std::cin >> FirstName >> LastName)//<---Needing to press Ctrl-z still a problem!
                AttemptUser = FirstName + ' ' + LastName;
                if((offset = line.find(AttemptUser, 0)) != std::string::npos) 
                {
                    NameFile.close();
                    std::cout << "Hello " << FirstName << std::endl;
                    User = FirstName;
                }
            }
        }
    }
    do
    {
        std::getline(std::cin, text);
        if(text.find("the code") != std::string::npos)
        {
            std::cout << "Yes " << User << ", this is the code" << std::endl;
        }
    }
while (text != "close");
system("pause");
return 0;
}

2 个答案:

答案 0 :(得分:1)

好的,这里有几个问题,但是SO都是关于学习和修复的,所以:

问题为零 放一个

using namespace std;
main之前

,并停止将std::放在std::命名空间中的所有内容之前。不是功能差异,但你应该知道这意味着什么。

问题,第一个:

         while(std::cin >> FirstName >> LastName)//<---Needing to press Ctrl-z still a problem!
            AttemptUser = FirstName + ' ' + LastName;

除非你强行退出程序(ctrl + c,ctrl + z等),否则这将永远重复。你可能打算在while(...)之后加一个大括号。无论如何,这两行形成一个完整的块,这意味着行

AttemptUser = FirstName + ' ' + LastName;

将一遍又一遍地执行,直到条件

std:cin >> FirstName >> LastName;

评估为false,这不会发生。查看C ++规范中的cin

你可能意味着要做的是:

         while(!(std::cin >> FirstName >> LastName))//<---Needing to press Ctrl-z still a problem!
            AttemptUser = FirstName + ' ' + LastName;

差异很微妙,但很重要。另外,使用字符串作为布尔操作数是愚蠢的。

问题,第二次

您永远不会阅读该文件。它被打开,检查了eof,并且最终(理论上,虽然它在这个实现中永远不会发生)关闭,但你从来没有真正从文件中读取任何内容。这意味着::eof 总是为假,假设文件存在且不为空。

问题,第3次

if(PassWord == "password")
{
    ...
 }
else if (PassWord != "password")
{
    ....
}

好的,这就像说

if(I am alive)
{
    call me!
}
else if (I am not alive)
{
    send flowers or raid the closets;
}

跳过()中的else。在许多其他事情中,它是多余的。

问题,第4次

        while(!NameFile.eof())
        {
            while(std::cin >> FirstName >> LastName)//<---Needing to press Ctrl-z still a problem!
            AttemptUser = FirstName + ' ' + LastName;
            if((offset = line.find(AttemptUser, 0)) != std::string::npos) 
            {
                NameFile.close();
                std::cout << "Hello " << FirstName << std::endl;
                User = FirstName;
            }
        }
如果offset等于line.find(AttemptUser,0)

将以史诗的方式完全失败,因为你关闭文件,然后在下一个循环中检查它eof,这将永远发生,除非你已经想出如何通过键盘输入 nothing 。这可能很难。

其他

如果使用visual studio,请输入Ctrl+A,然后输入Ctrl+KD。它应该重新格式化您的代码(取决于您的键绑定),并向您展示有关您的块/缩进结构的有趣信息,这可能会让您感到惊讶。

<强>猜测

我要走出去,说出来:

        while(!NameFile.eof())
        {
            while(std::cin >> FirstName >> LastName)//<---Needing to press Ctrl-z still a problem!
            AttemptUser = FirstName + ' ' + LastName;
            if((offset = line.find(AttemptUser, 0)) != std::string::npos) 
            {
                NameFile.close();
                std::cout << "Hello " << FirstName << std::endl;
                User = FirstName;
            }
        }

应该是这样的:

std::cin >> FirstName >> LastName;

if (FirstName != "" || LastName != "")
{
    AttemptUser = FirstName + " " + LastName;
    while(!NameFile.eof())
    {
        getline(NameFile,line); //<< !!!!!!!!!!!!!!! READ THE FILE
        if (line.find(AttemptUser,0) != string::npos)
        {
            /// found
            cout << "Hello " << FirstName << endl;
            User = FirstName; /// I hope you don't have multiple users with the same first name.
            break; // <------- REALLY FREAKING IMPORTANT
        }
    }
    cout << "Who are you?\n";
}

我可以坚持下去。修复这个问题,意识到VS2012 Express实际上有一个调试器,并回来提出更多问题。

答案 1 :(得分:0)

FirstName + LastName = AttemptUser;没有做你期望的事。 它应该最有可能是AttemptUser = FirstName + ' ' + LastName;

它被卡在一个infite循环中,因为AttemptUser永远不会给出一个值,这会让我说你应该总是初始化你的变量。声明没有值的变量,然后像你在这里所做的那样引用它们会导致非常意外的结果。只要学会在声明变量时始终给出初始值的习惯,这样可以避免很多麻烦。

当您执行FirstName + LastName = AttemptUser;时,您确实将AttemptUser的值指定为LastName

修改 不得不做一点调试......永远不会分配变量line。您没有正确读取文件或在任何地方使用其数据。使用std::getline(fstream, string)逐行读取文件。此外,如果用户输入 有效&#34;,while(std::cin >> FirstName >> LastName)应该反转为&#34;再次阅读。