该程序相对简单,只假设接收一个以分号分隔的值/string/line的文本文件,颠倒值的顺序,将所有值放回一起,然后输出到一个新文件。然而,有一些规范规定,我们必须使用一个实现简单链表数据结构的堆栈。我对C还很陌生,只是学习了指针的基础知识(我来自Java和.NET,这对我来说是一场与lol作斗争的噩梦)。此外,规范特别指出,push()函数必须接受"旧的栈顶(节点)"one_answers"要推送的值",并将更新后的指针返回到栈顶。此外,pop()必须将"指向当前堆栈顶部的指针的指针"作为参数,并返回弹出节点的值。
我们假设使用gcc-o progname progname.c-Wall-m32-o进行编译。源代码编译得很好,但当试图用实际的示例文件构建堆栈时,我会收到一个Segmentation Fault。然而,我已经通过gdb运行了我的代码,它说Segmentation Fault发生在我在main()中的"push((values->head),str1);"调用中。由于这是对push()的调用,我猜我在链表和/或堆栈中忽略了更基本的逻辑错误。
在这一点上,我已经耗尽了我的大脑,我一辈子都无法弄清楚我哪里出了问题。如果有人能给我一些帮助,我将永远感激。
此外,如果某些代码看起来很难看,我深表歉意。我只和C一起工作了大约两个星期,现在
一个示例输入文件是:
23414;-5224;23;569;
预期输出文件为:
569;23;-5224;23414;
以下是我迄今为止开发的内容:
#include <stdio.h>
#include <assert.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdbool.h>
int STACK_ELEMENTS = 0;
typedef struct node {
char *value;
struct node *next;
} Node;
typedef struct my_stack {
Node *head;
} Stack;
Stack *values;
bool stack_isEmpty() {
if (STACK_ELEMENTS < 1)
return true;
else
return false;
}
Node *push(Node *oldHead, char *val) {
Node *newNode;
newNode = malloc(sizeof(Node));
newNode -> value = val;
if (oldHead == NULL) {
values -> head = newNode;
values -> head -> value = val;
}
else {
values -> head -> next = newNode;
values -> head = newNode;
}
free(newNode);
STACK_ELEMENTS++;
return (values -> head);
}
char *pop(Node **pHead) {
char *val;
if ((*pHead) != NULL) {
Node *tempNode;
tempNode = malloc(sizeof(Node));
tempNode = *pHead;
val = tempNode -> value;
*pHead = tempNode -> next;
free(tempNode);
STACK_ELEMENTS--;
}
else
return 0;
return val;
}
int main(int argc, char *argv[]) {
/*verify arguments*/
if (argc != 3) {
fprintf(stderr, "usage: strrev <file> <newfile>n");
exit(1);
}
char *fileIn = argv[1];
char *fileOut = argv[2];
/*open file streams*/
FILE *in = fopen(fileIn, "r");
FILE *out = fopen(fileOut, "w");
/*scan input file and delimt on semicolon*/
/*input file is a single line of semicolon-delimited values*/
char str1[128];
while(!feof(in))
{
/*scan, delimiting on semicolon*/
/*if the scanned element does not fit format, break*/
if (fscanf(in, "%[^;];", str1) != 1) {
break;
}
push((values -> head), str1);
}
while(!stack_isEmpty()) {
fprintf(out,"%s;", pop(&(values -> head)));
}
fclose(in);
fclose(out);
return 0;
}
Stack *values;
此"值"似乎未初始化。
您需要的是:
Stack *values = malloc(sizeof(Stack ));
您一直在堆栈上推送相同的地址(char str1[128])。它也是一个局部变量。
相反,您需要读入值并为它们分配堆,然后在堆栈上添加堆对象,并在推送时释放它。
例如
char* str1 = malloc(128);
更重要的是,在创建堆栈之前取消引用values
,因为values
只是一个指针:
push( (values->head), str1 );
您需要首先创建堆栈,以便values
指向某个东西:
values = malloc( sizeof(Stack) );
注意:变量名使用大写字母不是一个好的做法,通常在C.中用大写字母定义宏