(C)将std解析为链表,无限循环

时间:2015-02-18 04:20:48

标签: c scanf

由于某种原因,代码在第一个printf结束后的for循环附近保持segfaulting。它根本不打印第二个printf,有人能指出我正确的方向吗?我认为这与内存中的问题有关

struct node{
    char *fullString;
    char fileName[1024];
    int  lineNumber;
    char filler[1024];
    struct node *next;
}; 

int main (int argc, char *argv[])
{

    char tmpstring[1024];
    /* This won't change, or we would lose the list in memory */
    struct node *head = NULL;       
    //tail
    struct node *tail = NULL;  
    /* This will point to each node as it traverses the list */
    struct node *ptr, *newnode;  

    while (fgets(tmpstring, 1024, stdin) == tmpstring) 
    {
      if ((newnode = (struct node *)malloc(sizeof(struct node))) == NULL) {
        fprintf(stderr,"mklist: malloc failure for newnode\n");
        exit(1);
        }
        if ((newnode->fullString = malloc(strlen(tmpstring)+1)) == NULL) {
        fprintf(stderr,"mklist: malloc failure for newnode->str\n");
        exit(1);
        }
        if (strncpy(newnode->fullString, tmpstring, strlen(tmpstring)+1) != newnode->fullString) {
        fprintf(stderr,"mklist: string copy problem\n");
        exit(1);
        }

      strcpy(newnode->fullString, tmpstring);
      newnode->next = NULL;

//      if (3 != scanf(tmpstring, "%255s:%d:%255s", newnode->fileName, &newnode->lineNumber, newnode->filler))
 //       abort();

      if (tail == NULL)
        head = tail = newnode;
      else {
        tail->next = newnode;
        tail = newnode;
      }
    }

    // Now print the list, element by element.
    for (ptr = head; ptr != NULL; ptr = ptr->next)
        printf("%s\n", ptr->fullString);
        printf("%s:%d:%s\n", ptr->fileName, ptr->lineNumber, ptr->filler);
}

1 个答案:

答案 0 :(得分:1)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>

#define MAX_LINE_SIZE 1024

struct node
{
  char fullString[MAX_LINE_SIZE];
  char fileName[MAX_LINE_SIZE];
  int  lineNumber;
  char filler[MAX_LINE_SIZE];

  struct node *next;
};  

int main (int argc, char **argv)
{
  char tmpstring[MAX_LINE_SIZE];
  struct node *head = NULL;
  struct node *tail = NULL;
  struct node *ptr, *newnode;  

  while (fgets(tmpstring, MAX_LINE_SIZE, stdin)) 
  {
    size_t len = strlen(tmpstring);
    char *cptr = tmpstring, *eptr;

    if (0 == len || tmpstring[len - 1] != '\n')
      assert(0), abort();  /* NOTE: will abort on too long lines and if EOF occurs mid-line */

    if (NULL == (newnode = calloc(1, sizeof(struct node))))
      assert(0), abort();

    strcpy(newnode->fullString, tmpstring);
    newnode->lineNumber = -1;
    newnode->next = NULL;

    if (NULL == (eptr = strchr(cptr, ':')))
      assert(0), abort();

    *eptr = '\0';
    if (1 != sscanf(cptr, "%255s", newnode->fileName))
      assert(0), abort();

    cptr = eptr + 1;

    if (NULL == (eptr = strchr(cptr, ':')))
      assert(0), abort();

    *eptr = '\0';
    if (1 != sscanf(cptr, "%d", &newnode->lineNumber))
      assert(0), abort();

    cptr = eptr + 1;
    strcpy(newnode->filler, cptr);

    if (tail == NULL)
      head = tail = newnode;
    else {
      tail->next = newnode;
      tail = newnode;
    }
  }

  for (ptr = head; ptr != NULL; ptr = ptr->next)
    printf("%s:%d:%s", ptr->fileName, ptr->lineNumber, ptr->filler);    

  return 0;
}

添加一些更好的错误处理,这可能就是你所追求的 - 只要你的输入没有超过MAX_LINE_SIZE-1个字符的行。