C-链接列表程序分割故障在fgets



它第一次运行良好。我可以添加一个项目,然后使用显示功能显示。但是,当我尝试添加第二个值时,一旦击中" A",我就会得到SEG故障。我在顶部发表了评论。

(除了添加以外,我还没有打扰其他功能。)

#include    <stdio.h>
#include    <stdlib.h>
#include    <string.h>
#include    <ctype.h>
#include    "sortedll.h"
int     main(void)
{
int             intVal;
LNode           *headPtr = NULL;
char            buf[BUFLEN];
int             result;
do  {
    // ask the user what they want to do
    DisplayMenu();
    printf("Please enter a selection: ");
    fgets(buf, BUFLEN, stdin);
    *buf = toupper(*buf);
    switch (*buf)
        {
        case   'A':
            // prompt the user for a value; if we get one, add it to the
            // list
            printf("Please enter an integer value to add: ");
            fgets(buf, BUFLEN, stdin);
            //=======================================================================
            printf("check"); //doesn't print this second time around. seg fault at fgets?
            //=======================================================================
            if (1 != sscanf(buf, "%d", &intVal))
                {
                puts("Error reading the integer value...");
                }
            else
                {
                printf("1");
                headPtr = AddItem(headPtr, intVal);
                }
            break;
        case   'R':
            // if the list is empty display a message; else, get a value
            // from the user and attempt to remove it from the list
            if (NULL == headPtr)
                {
                puts("The list is currently empty...");
                }
            else
                {
                printf("Please enter an integer value to remove: ");
                fgets(buf, BUFLEN, stdin);
                if (1 != sscanf(buf, "%d", &intVal))
                    {
                    puts("Error reading the integer value...");
                    }
                else
                    {
                    headPtr = RemoveItem(headPtr, intVal);
                    }
                }
            break;
        case   'D':
            // display the current contents of the list
            result = DisplayList(headPtr);
            printf("Currently there %s %d node%s in the list.n"
                                , (result != 1) ? "are" : "is"
                                , result
                                , (result != 1) ? "s" : "");
            break;
        case   'Q':
            // release all allocated memory and set the head pointer to
            // NULL to indicate that it is empty
            result = ReleaseMemory(headPtr);
            printf("There %s %d node%s released."
                                , (result != 1) ? "were" : "was"
                                , result
                                , (result != 1) ? "s" : "");
            headPtr = NULL;
            break;
        default:
            puts("Unrecognized option; please try again.");
            break;
        }
    puts(" ");
    } while ('Q' != *buf);
puts("Thanks for playing!  Bye!!n");
return  0;
}  // end of "main"

// ==== AddItem ===============================================================

LNode*  AddItem(LNode  *headPtr, int  newItem)
{
    LNode *node = malloc(sizeof(*node));
    node->value = newItem;

    if(headPtr == NULL)
        {
        node->next = NULL;
        return node;
        }
    LNode *leadPtr = headPtr;
    LNode *trailPtr = headPtr;
    while(leadPtr->value != newItem)
        {
        leadPtr = leadPtr->next;
        trailPtr = leadPtr;
        }    
    leadPtr = leadPtr->next;
    free(trailPtr->next);    
    trailPtr->next = node;
    node->next = leadPtr;
    return headPtr;
}  // end of "AddItem"

// ==== DisplayList ===========================================================

int     DisplayList(LNode  *nodePtr)
{
    auto    int         counter = 0;
    // if the list is empty, indicate as such and return zero
    if (NULL == nodePtr)
        {
        puts("The list is currently empty...");
        return (0);
        }
    while (NULL != nodePtr)
        {
        printf("%dn", nodePtr->value);
        nodePtr = nodePtr->next;
        counter++;
        }
    return (counter);
}  // end of "DisplayList"

// ==== DisplayMenu ===========================================================

void    DisplayMenu(void)
{
    puts("A)dd a value");
    puts("R)emove a value");
    puts("D)isplay the list");
    puts("Q)uit");
}  // end of "DisplayMenu"

// ==== ReleaseMemory =========================================================

int     ReleaseMemory(LNode  *headPtr)
{

}  // end of "ReleaseMemory"

// ==== RemoveItem ============================================================

LNode*  RemoveItem(LNode  *headPtr, int  targetItem)
{

}  // end of "RemoveItem"

看起来您尝试访问Leadptr->值时,当Leadptr可能为null时。

while(leadPtr->value != newItem)
    {
    leadPtr = leadPtr->next;
    trailPtr = leadPtr;
    }

您需要在尝试访问它的成员之前确保Leadptr!= null。

我建议您重构代码段所属的功能,它在内存访问方面看起来有些脆弱。

,您真的应该检查Malloc调用的返回值:

lnode *node = malloc(sizeof( *node));

node-> value = newitem;

如果您用完了堆空间?

相关内容

  • 没有找到相关文章

最新更新