我有以下代码,它只需要一个字符串并在字母表中找到每个字符的索引。
void encrypt()
{
string alpha = "abcdefghijklmnopqrstuvwxyz";
string word;
vector<char> temp;
char a, b;
cout << "Enter string to encrypt: \n";
cin >> word;
for (int i=0; i<word.length(); i++)
{
bool t = false;
a = word[i];
for (int j=0; j<alpha.length(); j++)
{
b = alpha[j];
if (a == b)
{
cout << a << "'s index = " << j+1 << endl;
t = true;
}
}
if (t == false)
{
cout << "space here\n";
}
}
}
当我输入没有空格的单词/字符串时,代码工作正常,但是当我输入带空格的字符串时,程序进入无限循环。
编辑由于请求而添加的main():
main()
{
int a;
bool b = false;
while (b == false)
{
cout << "1. Encrypt a string\n";
cout << "2. Decrypt a string\n";
cout << "3. Exit\n";
cout << endl;
cin >> a;
cout << endl;
if (a == 1)
{
encrypt();
}
else if (a == 2)
{
decrypt();
}
else if (a == 3)
{
b = true;
}
}
return 0;
}
答案 0 :(得分:1)
cin >> word;
将只读取第一个单词并将第二个单词留在输入流中。之后,通话
cin >> a;
除非第二个单词以数字开头,否则将导致错误。程序进入错误状态后,不会读取任何内容,程序会保持循环状态。
要诊断这些问题,请务必在读取操作后检查流的状态。
if ( cin >> word )
{
// Use word
}
else
{
// Deal with error.
}
if ( cin >> a )
{
// Use a
}
else
{
// Deal with error.
}
要解决您的实际问题,请不要使用operator>>
来读取空格分隔的字符串。使用getline
(并使用与word
不同的变量名称。)
std::string str;
if ( getline(std::cin, str) )
{
// Use str
}
else
{
// Deal with error.
}
但是,为了成功使用getline
,您必须确保在读取a
之后,忽略该行的其余部分。否则,getline
将读取该行的其余部分。
if ( cin >> a )
{
// Ignore rest of the line
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
// Use a
}
else
{
// Deal with error.
}
答案 1 :(得分:0)
您可以通过 cin 后立即执行 cout 来检查 cin 是否完全接受空格分隔字符串。如果 cin 不接受空格分隔字符串,请尝试使用 getline
已解决的问题:
使用以下内容:
cout << "Enter string to encrypt: ";
scanf(" %[^\n]s",word);
for (int i=0; word[i]!='\0'; i++)
{
使用
include <cstdio>
希望这能解决问题!!我将使用字符串来回复您的解决方案..
答案 2 :(得分:0)
将cin >> word;
替换为getline(cin, word);
。它将接受一行作为输入。这将解析包含空格的输入。
就无限循环问题而言,清除流cin.clear();