我说的很对,因为我无法解释我要描述的情况。我需要你的关注!
昨天我用C编写了一个程序。该程序将一个字符串作为输入,如果该字符串的格式为“ PKPKKKPPPKKKP”,即仅包含'P'和'K'字符,则它将输出YES或NO。是,如果单个“ P”字符与“ K”字符匹配。就像我们对括号字符问题'(',')'所做的一样,仅代替'('我必须使用'P'而不是')','K'。
在这里的一点帮助下,我设法完成了程序,程序运行正常。我认为复制代码不会帮助任何人,但是我将解释它的工作原理。
程序说明:
程序将一个字符串(该字符串最多可包含500个长度)作为输入,如果该字符串仅包含'P'和'K'字符,则如上所述,它会打印YES或NO,否则将拒绝它。然后,它逐个字符地读取输入,当找到“ P”时,将其压入堆栈,否则弹出。 (我用链接列表实现了堆栈,因此用户将能够给出他想要的尽可能大的字符串(或者我认为是这样...))。
在用户键入字符串之前,符号“ A”已在堆栈中。因此,输入是由程序逐个字符进行分析的,如果找到了“ P”,则将其压入堆栈,否则弹出堆栈。如果末尾的堆栈顶部是'A'字符,则程序正在打印YES,否则打印NO。
问题描述:
因此,我今天和我的一个朋友一起执行该程序。一切都还好。直到我传递一个非常大的字符串作为输入,例如300'P和300'K(记住我的字符串是一个char字符串[500])。它打印是。然后我输入了一个字符串,例如800'P's + 800'K's。它没有正确运行。
这是问题所在,无论发生什么事件,如果我键入一个字符串,即正常的“ PKPKPK”,它将打印数百万个怪异的符号(x x X x x X)。我发誓,我没碰代码!我再次编译,再次运行,一样!我的电脑(Windows 10)好像有问题。
问题仍然存在于另一个程序中……我试图制作一个简单的程序,以使通过链表实现的堆栈起作用。我按了字符“ a”并打印。它打印“á”。我按了“ b”。它显示“ h”。我按了“ d”。打印“ L”。
显然,我不应该键入这么大的字符串,因为其长度限制为500。但是问题仍然存在!我无法再编写带有链表的程序。生无可恋!
代码:
#include "stdio.h"
#define FIRST_SYMBOL_IN_STACK 'A'
#define TRUE 1
#define FALSE 0
#define STR_LENGTH 50
#define YES "YES"
#define NO "NO"
#define PLA 'P'
#define KAL 'K'
typedef struct node {
char simvolo_eisodou;
struct node *next;
} node;
node *top = NULL; // the top of the stack
void push(char simvolo_eisodou); //stack function
int isStackEmpty(); //stack function
void pop(); //stack function
void printStack(); //print the current stack elements
int isInputValid(char *string);
void printWelcome();
int main() {
char input_string[STR_LENGTH], apantisi = 'G'; //O xristis mporei na dwsei input_string mikous ews 500 xaraktires
push(FIRST_SYMBOL_IN_STACK);
int i = 0;
scanf("%s", input_string);
if (isInputValid(input_string)) {
while (input_string[i] != '\0') {
if (input_string[i] == PLA) {
push(PLA);
printStack();
} else {
pop();
printStack();;
}
i++;
}
} else {
printf("Den anagnwristike to %s, input_string=(P|K)*\n");
_exit(-1);
}
if (top->simvolo_eisodou == FIRST_SYMBOL_IN_STACK) {
printf("%s\n", YES);
} else {
printf("%s\n", NO);
}
return 0;
}
void push(char simvolo_eisodou) {
node *newNode = (node*)malloc(sizeof(node));
newNode->simvolo_eisodou = simvolo_eisodou;
newNode->next = top;
top = newNode;
free(newNode);
}
int isStackEmpty() { //Thewrw oti i stoiva einai adeia otan i korifi einai to arhiko simvolo
if (top->simvolo_eisodou == FIRST_SYMBOL_IN_STACK) {
return TRUE;
}
return FALSE;
}
void pop( ){
if (isStackEmpty()) {
printf("KENO\n");
printf("%s\n", NO);
_exit(-1);
}
node *temp = top;
top = top->next;
free(temp);
}
void printStack() {
node *current = top;
while (current != NULL) {
printf("%c ", current->simvolo_eisodou);
current = current->next;
}
free(current);
printf("\n");
}
int isInputValid(char *string) {
int i = 0;
while (*(string + i) != '\0') {
if (!(*(string + i) == 'P' || *(string + i) == 'K')) {
return 0;
}
++i;
}
return 1;
}
void printWelcome() {
printf("\n====================================================================\n");
printf("Welcome\n");
printf("====================================================================\n");
printf("\n\n\n Plz type input_string=(P|K)*\n");
}
最佳答案
您的代码具有未定义行为(UB)。用UB运行代码的结果是不可预测的。有时它似乎可以工作,但不能保证每次都会产生相同的结果。
UB的至少一个来源是以下代码:
top=newNode;
free(newNode);
释放
newNode
后,top
指针将变为无效,对该指针的任何取消引用都将导致UB。