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

标签 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

堆栈2.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() 的简单输入突然不起作用。你能帮忙看看吗?谢谢。

最佳答案

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

试试这个:

堆栈.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);

堆栈.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);
}

尝试堆栈.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);
}

关于c - 我的 C 程序没有检测到键盘输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31892277/

相关文章:

c++ - opengl 中的着色器应该做多少工作?

c - C 中等效的 plpgsql 触发器

c - 如何从 ZLIB 压缩器获取 <距离,长度> 对

c - 使用 atoi() 不打印所需的输出

C编程,GSL vector 库,错误: incompatible type for argument 1 of 'gsl_rng_uniform'

c - 总共有多少读或写文件描述符?

c - 禁用 ASLR 导致 fread() 在 c 程序中失败

c - C 中的十六进制常量是无符号的,即使 L 后缀

c - 如何修复链表段错误 C

c++ - 在C++中将IPv6转换为IPv4格式?