鱼C论坛

 找回密码
 立即注册
查看: 4548|回复: 4

获取scanf的返回值失败,段错误

[复制链接]
发表于 2021-4-18 19:37:11 | 显示全部楼层 |阅读模式
10鱼币
当输入的数据错误时scanf返回值为零,正常会不执行循环继续往下执行程序的,但不知道怎么回事会返回段错误。
求解。。。

823IF(Y%O1QV22$)ULLX((J.png

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

#define ElemType int

typedef struct Lnode
{
        ElemType data;
        struct Lnode *prior, *next;
}Lnode, *LinkList;

void insert(LinkList L);
void change(LinkList L, int i);
void print(LinkList L);

void insert(LinkList L)
{
        ElemType n;
        Lnode *p;
        _Bool flag = 1;

        p = L;

        printf("请输入链表数据:\n");
        while (flag)
        {
                flag = scanf("%d", &n);

                if (flag)
                {
                        Lnode *new;
                        new = (Lnode*)malloc(sizeof(Lnode));
                        if (new == NULL)
                        {
                                printf("内存分配失败!\n");
                                exit(1);
                        }
                        new->data = n;
                        p->next = new;
                        new->next = NULL;
                        new->prior = p;
                        p = new;

                }
        }
}

void change(LinkList L, int i)
{
        Lnode *p, *pre;

        p = L->next;

        while (i-- && p != NULL)
        {
                p = p->next;
        }

        pre = p->prior;

        p->prior = pre->prior;
        pre->prior->next = p;

        pre->next = p->next;
        p->next->prior = pre;

        p->next = pre;
        pre->prior = p;
}

void print(LinkList L)
{
        Lnode *p;

        p = L->next;
        while (p)
        {
                printf("%d ", p->data);
                p = p->next;
        }
        putchar('\n');
}
int main(void)
{
        int p;
        LinkList L;

        L = (LinkList)malloc(sizeof(Lnode));
        if (L == NULL)
        {
                printf("内存分配失败!\n");
                exit(1);
        }
        L->prior = NULL;
        L->next = NULL;

        insert(L);

        printf("请输入指针位置:");
        scanf("%d", &p);
        change(L, p);

        printf("交换之后的链表:");
        print(L);

        return 0;
}

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-4-18 21:05:32 | 显示全部楼层
本帖最后由 剑魔独孤 于 2021-4-18 21:06 编辑

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

#define ElemType int

typedef struct Lnode
{
        ElemType data;
        struct Lnode *prior, *next;
}Lnode, *LinkList;

void insert(LinkList L)
{
        ElemType n;
        Lnode *p;
        _Bool flag = 1;

        p = L;

        printf("please input a value:\n");
        while (flag)
        {
                flag = scanf("%d", &n);

                if (flag)
                {
                        Lnode *new;
                        new = (Lnode*)malloc(sizeof(Lnode));
                        if (new == NULL)
                        {
                                printf("内存分配失败!\n");
                                exit(1);
                        }
                        new->data = n;
                        p->next = new;
                        new->next = NULL;
                        new->prior = p;
                        p = new;

                }
        }
}

void change(LinkList L, int i)
{
        Lnode *p, *pre;

        p = L->next;

        while (i-- && p->next != NULL)
        {
                p = p->next;
        }

        pre = p->prior;

        p->prior = pre->prior;
        pre->prior->next = p;

        pre->next = p->next;
        p->next = pre;

}

void print(LinkList L)
{
        Lnode *p;

        p = L->next;
        while (p!=NULL)
        {
                printf("%d ", p->data);
                p = p->next;
        }
        putchar('\n');
}
int main()
{
        int p;
        LinkList L;

        L = (LinkList)malloc(sizeof(Lnode));
        if (L == NULL)
        {
                printf("memory fail\n");
                exit(1);
        }
        L->prior = NULL;
        L->next = NULL;

        insert(L);
        
        printf("point:\n");
        getchar();
        scanf("%d",&p);
        change(L, p);

        printf("swap:\n");
        print(L);

        return 0;
}
捕获.PNG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-4-18 21:10:44 | 显示全部楼层
你没写注释,我不知道你是叫交换输入位置处的数与后面的交换还是其他的,,下次记得写注释,一般没有谁、愿意搞一个没有注释的代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-4-19 10:47:04 | 显示全部楼层
剑魔独孤 发表于 2021-4-18 21:10
你没写注释,我不知道你是叫交换输入位置处的数与后面的交换还是其他的,,下次记得写注释,一般没有谁、愿 ...

主要是代码我试了,不用获取的scanf的返回值可以运行,只有flag = scanf那块有问题,但是我其他的程序用却没问题。所以就想问为什么获取不到scanf返回的0,就没详细写注释
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-4-23 23:11:12 | 显示全部楼层
嗯嗯,有返回值呀,不然,我这是怎么调出来呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-14 15:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表