使用getchar()读取没有尾随换行符的文本

时间:2017-03-12 18:52:00

标签: c string stack newline getchar

我正在研究一个程序,目的是读取括号/括号并确定它们是否在每一侧都是平衡的,但在阅读最后一行文本时遇到了麻烦。这可能有点令人困惑,但我会附上输入:

3          <-- The number of lines I'll scan
([])       <-- Problem
(([{}])))
([()[]()])()

我的程序在面对手动输入时效果很好;那是我自己输入每一行并按回车键。当我复制一个文本块时,程序无法打印最终答案(是或否),除非我按回车键。这是我的代码:

#include <stdio.h>
#include <stdlib.h>


#ifndef status_h
#define status_h
enum status { SUCCESS, FAILURE };
typedef enum status Status;

enum boolean { TRUE, FALSE };
typedef enum boolean Boolean;

#endif

typedef void* NODE;

struct node {
    char data;
    struct node* next;
} *head;
typedef struct node Node;

void stack_init_default(Node* hStack);
int stack_empty(void);
char stack_top(Node* hStack);
NODE stack_pop(Node* hStack);
NODE stack_push(Node* hStack, char item);
void stack_destroy(void);

int main(int charc, char* argv[])
{
    char x;
    int num, error = 0, i;
    Node* stack;
    stack_init_default(stack);
    scanf("%d ", &num);
    for (i = 0; i < num; i++)
    {
        stack_destroy();
        error = 0;

    while ((x = getchar()) != '\n' )
    {
        if (x == ' ')
            continue;
        if ((x == '(')||(x == '[')||(x == '{'))
        {
            stack_push(stack, x);
        }
        else if ((x == ')')&&(stack_top(stack)=='('))
        {
            stack_pop(stack);
        }
        else if ((x == ']')&&(stack_top(stack)=='['))
        {
            stack_pop(stack);
        }
        else if ((x == '}')&&(stack_top(stack)=='{'))
        {
            stack_pop(stack);
        }
        else
        {
            error = 1;
        }
    }
            putchar('\n');
            if (stack_empty() == 0 || error == 1)
                {
                    printf("No");
                }
              else
            {
                printf("Yes");
            }
    }
    printf("\n");

    return 0;
}

void stack_init_default(Node* hStack)
{
     head = NULL;
}

NODE stack_push(Node* hStack, char item)
{
    Node* tmp = (Node*)malloc(sizeof(Node));
    if(tmp == NULL)
    {
        exit(0);
    }
    tmp->data = item;
    tmp->next = head;
    head = tmp;
    return head;
}

NODE stack_pop(Node* hStack)
{
    Node* tmp = head;
    head = head->next;
    free(tmp);
    return head;
}

char stack_top(Node* hStack)
{
    if (head == NULL)
    {
        return '\0';
    }
    return head->data;
}

int stack_empty(void)
{
    return (head == NULL);
}

 void stack_destroy(void)
{

    Node* phStack = head;

    while (head != NULL)
    {
        phStack = head->next;
        free(head);
        head = phStack;
    }
    free(phStack);
    head = NULL;

}

我的问题如下:

3
([])
(([{}])))
([()[]()])()
Yes
No

Yes

所以我的程序输出yes或no,但冻结了最后一个问题,等待我按换行完成循环。我假设问题出在while循环的某个地方,并且由于粘贴的文本没有最终的换行符,循环永远不会结束,但我不确定如何解决这个问题。谢谢你的帮助。

0 个答案:

没有答案