gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:34:53 26 4
gpt4 key购买 nike

我试图在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com