为什么我的inputchar函数会保持循环?

时间:2009-12-11 13:59:23

标签: c++ linked-list

#include <iostream>
using namespace std;

struct Node
{
    char item;
    Node *next; 
};

void inputChar ( Node * );
void printList (Node *);
char c;

int main()
{

    Node *head;
    head = NULL;
    c = getchar();
    if ( c != '.' )
    {
        head = new Node;
        head->item = c;
        inputChar(head);
    }
    printList(head);
    return 0;
}

void inputChar(Node *p)
{
    getchar();
    while ( c != '.' )
    {
        p->next = new Node;             
        p->next->item = c;
        inputChar(p->next);
    } 
    p->next = new Node; // dot signals end of list              
    p->next->item = c;
}

void printList(Node *p)
{
    if(p = NULL)
        cout << "empty" <<endl;
    else
    {
        while (p->item != '.')
        {
            cout << p->item << endl;
            printList(p->next);
        }
    }
}

我正在尝试创建一个由用户输入的字符链表。句点表示输入的结束。我的程序继续循环inputChar函数。有什么想法吗?

5 个答案:

答案 0 :(得分:2)

也许您应该添加:

c = getchar();

但是,你正在做的事情有点危险。在某些平台上,getchar()将在使用上一个getchar()调用的ENTER键后立即返回。所以你应该考虑在循环中。也许在inputChar函数中添加一个额外的getchar()

此外,保罗写的是真的。您应该使用简单的while更改if循环。

答案 1 :(得分:2)

因为你永远不会在循环中更改c的值。那为什么它会爆发呢?

您只需在循环前设置一次c的值。

答案 2 :(得分:2)

你有inputChar调用inputChar。当你深入到inputChars并且得到。时,当它返回时,它的调用者仍然有c等于它调用inputChar之前的任何东西,所以它继续循环。

答案 3 :(得分:2)

澄清变化getchar(); to c = getchar();在inputChar过程的第一行。

答案 4 :(得分:1)

考虑类似这样的东西,它测试过早结束和指定的行尾分隔符,并允许你在将来指定与std :: cin不同的流。

void inputChar(Node *p, std::istream& in = std::cin)
{
    char ch;
    while(in.get(ch) && in && ch != '.')
    {
       ...
    } 
}