如果未输入“密码”,则代码会询问用户的姓名。如果找到该名称,则会将其名字指定为用户。
代码打击是较大版本的简化版本,但问题完全相同。在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;
}
答案 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;再次阅读。