我的c程序没有检测到键盘输入

时间:2015-08-08 10:47:37

标签: c

我试图在Stack实现上做一个简单的演示。

这是Stack2.h:

#ifndef _STACK_H

struct Node;
typedef int ElementType;
typedef struct Node *PtrToNode;
typedef PtrToNode Stack;

int IsEmpty(Stack S);
Stack CreateStack(void);
void DisposeStack(Stack S);
void MakeEmpty(Stack S);
void Push(ElementType X, Stack S);
ElementType Top(Stack S);
void Pop(Stack S);

#endif

Stack2.c:

#include "Stack2.h"
#include <stdlib.h>

struct Node {
  ElementType Element;
  PtrToNode Next;
};

int IsEmpty(Stack S) {
  return S->Next == NULL;
}

Stack CreateStack(void) {
  Stack S = malloc(sizeof(struct Node));
  MakeEmpty(S);
  return S;
}

void DisposeStack(Stack S) {
  MakeEmpty(S);
  free(S);
}

void MakeEmpty(Stack S) {
  while (!IsEmpty(S)) Pop(S);
}

void Push(ElementType X, Stack S) {
  PtrToNode newNode = malloc(sizeof(struct Node));
  newNode->Element = X;
  newNode->Next = S->Next;
  S->Next = newNode;
}

ElementType Top(Stack S) {
  if (!IsEmpty(S))
    return S->Next->Element;
  return 0;
}

void Pop(Stack S) {
  PtrToNode toPop = S->Next;
  S->Next = S->Next->Next;
  free(toPop);
}

tryStack.c:

#include <stdio.h>
#include "Stack2.h"

int main() {
  int num;
  char c;
  Stack nums = CreateStack();
  while ((c = getchar()) != 'x') {
    num = c - '0';
    Push(num, nums);
  }
  while (!IsEmpty(nums)) {
    printf("%d\n", Top(nums));
    Pop(nums);
  }
  DisposeStack(nums);
  return 0;
}

然后我用以下行编译它们:

gcc tryStack.c Stack2.c -o stackDemo

它汇编了。然而,在输入命令stackDemo之后,它没有响应键盘上的任何按键;只有在我终止程序后,我输入的输入才出现在命令提示符下。这是我输入123然后按下Control-C后的情景:

C:\C_code>stackDemo
^C
C:\C_code>123

我无法弄清楚为什么通过getchar()的简单输入突然无法工作。你能帮忙看看吗?谢谢。

1 个答案:

答案 0 :(得分:0)

在创建堆栈时,您不必创建节点,我只会创建一个指向顶层节点的指针,然后将其设置为NULL,因此在创建后堆栈将为空。

试试这个:

Stack.h

struct Node;
typedef int ElementType;
typedef struct Node *PtrToNode;
typedef PtrToNode Stack;

int IsEmpty(Stack S);
Stack CreateStack(void);
void DisposeStack(Stack *S);
void MakeEmpty(Stack *S);
void Push(ElementType X, Stack *S);
ElementType Top(Stack S);
void Pop(Stack *S);

Stack.c

#include "Stack2.h"
#include <stdlib.h>

struct Node {
    ElementType Element;
    PtrToNode Next;
};

int IsEmpty(Stack S) {
    return S == NULL;
}

Stack CreateStack(void) {
    Node *S = NULL;
    return S;
}

void DisposeStack(Stack *S) {
    MakeEmpty(S);
    free(*S);
}

void MakeEmpty(Stack *S) {
    while (!IsEmpty(*S)) Pop(S);
}

void Push(ElementType X, Stack *S) {
    PtrToNode newNode = (PtrToNode)malloc(sizeof(struct Node));
    newNode->Element = X;
    newNode->Next = NULL;
    if (IsEmpty(*S))
    {
        *S = newNode;
        return;
    }
    newNode->Next = (*S);
    *S = newNode;
}

ElementType Top(Stack S) {
    if (!IsEmpty(S))
        return S->Element;
    return 0;
}

void Pop(Stack *S) {
    if (IsEmpty(*S)) return;
    PtrToNode toPop = *S;
    *S = (*S)->Next;
    free(toPop);
}

tryStack.c

#include <stdio.h>
#include "Stack2.h"

int main()
{
    int num;
    char c;
    Stack nums = CreateStack();
    while ((c = getchar()) != 'x' && (c >= '0' && c <= '9' || c == '\n')) {
        if (c == '\n') continue;
        num = c - '0';
        Push(num, &nums);
    }
    while (!IsEmpty(nums)) {
        printf("%d\n", Top(nums));
        Pop(&nums);
    }
    DisposeStack(&nums);

    return 0;
}

输入数字时,你必须忽略'\ n',如果你检查它们是否是数字也很好。

如果您坚持使用创建功能,您也可以使用此代码获取没有换行符的输入:

while ((c = getchar()) != 'x' && (c >= '0' && c <= '9' || c == '\n')) 
{
    if (c == '\n') continue;
    num = c - '0';
    Push(num, nums);
}