为什么字符串中的空格使我的代码无限循环?

时间:2016-08-17 05:23:54

标签: c++

我有以下代码,它只需要一个字符串并在字母表中找到每个字符的索引。

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;
}

3 个答案:

答案 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();

上的错误位