链接列表处理字符串,C

时间:2017-11-05 00:42:01

标签: c string linked-list

我正在尝试从用户那里获取输入(一个单词/字符串)并将其存储在我的链接列表中,但是当我打印我的列表时,程序结束。我是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输出的屏幕截图,以便您可以看到正在发生的事情

3 个答案:

答案 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