我正在尝试从用户那里获取输入(一个单词/字符串)并将其存储在我的链接列表中,但是当我打印我的列表时,程序结束。我是C语言的新手,对我的任何建议或文章都会非常感激!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct node {
int data, index;
char text[255];
struct node* next;
};
//Global Variables
struct node* root = NULL;
//Prototypes
void insertA();
void insertB();
void prn();
//Main
void main () {
char command[4];
int num;
char text[255];
while(1) {
printf("Command? "); //assume we know the key words
fflush(stdout);
scanf("%s", &command);
//Reads input and selects which command to execute
if (strcmp(command, "insertA")==0) {
scanf("%s", &text);
insertA(text);
} else
if(strcmp(command, "insertB")==0) {
scanf("%s", &text);
insertB(num);
} else
if (strcmp(command, "prn")==0) {
prn();
} else
if (strcmp(command, "end")==0) {
exit(1);
}
else {
return;
}
}
}
//Command Insert After
void insertA(char* text) {
struct node* temp;
temp = (struct node*)malloc(sizeof(struct node));
temp->data = text;
temp->next = NULL;
//Function if link does not exist, creates one
if(root==NULL) {
root = temp;
printf("Text inserted at beginning\n");
}
//If link exists, adds to the end
else {
struct node* p;
p = root;
while(p->next != NULL) {
p = p->next;
}
p->next = temp;
printf("Ok\n");
}
}
//Command Insert Before
void insertB(char* text) {
struct node* temp;
temp = (struct node*)malloc(sizeof(struct node));
temp->data = text;
temp->next=NULL;
//Function if link does not exist, creates one
if (root == NULL) {
root = temp;
printf("Text inserted at beginning\n");
fflush(stdout);
}
//If link exists, add to beginning
else {
temp->next=root;
root = temp;
printf("Ok\n");
fflush(stdout) ;
}
}
//Command Print
void prn() {
struct node* temp;
temp = root;
int i=1;
if(temp == NULL) {
printf("List is empty\n");
fflush(stdout);
}
else {
while(temp != NULL) {
printf("%d. ", i);
printf("%s\n",temp->data);
temp = temp->next;
i++;
}
printf("\n");
}
}
我将附上我得到here输出的屏幕截图,以便您可以看到正在发生的事情
答案 0 :(得分:1)
你的命令缓冲区只有4个字节 - “insertA”将如何适合它?
您正在使用scanf()
来获取命令。当你按Enter键时,scanf()
将用'\n'
分隔的字符串填充输入缓冲区,然后当它通过循环进入第二轮时,你的下一个scanf将首先读取换行符,而不是任何命令你想测试一下。
如果您想安全地重复使用text
缓冲区,请将其大小增加一些,然后使用fgets()
读取您的输入。
答案 1 :(得分:0)
您的问题出在prn
函数中:data
结构中的node
属性是int作为数据类型,但在prn
函数中,您将其用作字符串;这是你的错误答案:printf
函数导致分段错误
你只需要在结构中很好地定义你的属性,并在你的函数中正确使用它们
我会建议学习:指针和双指针,这些让你知道如何更好地编码。
答案 2 :(得分:0)
您的TEXT是 char 变量,而您将数据定义为 int
struct node {
int data, index;
char text[255];
struct node* next;
};
并且在插入时你也在打印功能temp->data = text;
你正在做printf("%s\n",temp->data);
而temp-&gt;数据是 int