m0_74734457 2023-06-30 21:54 采纳率: 40%
浏览 23
已结题

链表创建输入和打印出现乱码

在VS2022中创建了一个链表,但是测试时发现输入数据次数不对而且输出是是乱码,但是已经验证相同写法的另一链表存入数据和打印都正常,这是什么原因呢?

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
struct app
{
    char gender;
    int agemin;
    int agemax;
    long incomemin;
    long incomemax;
    struct app* next;
};
int main()
{
    int i, m;
    scanf("%d", &m);
    struct app* ahead = NULL;
    struct app* acur;
    struct app* aprev = NULL;
    for (i = 0; i < m; i++)
    {
        acur = (struct app*)malloc(sizeof(struct app));
        if (ahead == NULL)
            ahead = acur;
        else
            aprev->next = acur;
        acur->next = NULL;
        scanf("%c %d %d %ld %ld", &(acur->gender), &(acur->agemin), &(acur->agemax), &(acur->incomemin), &(acur->incomemax));        
        aprev = acur;
    }
    acur = ahead;
    for (i = 0; i < m; i++)
    {
        printf("%c %d %d %ld %ld", acur->gender, acur->agemin, acur->agemax, acur->incomemin, acur->incomemax);
        acur = acur->next;
        printf("\n");
    }
    acur = ahead;
    while (acur != NULL)
    {
        acur = ahead;
        ahead = acur->next;
        free(acur);
        acur = acur->next;
    }
    return 0;
}


下面是运行结果

img

  • 写回答

3条回答 默认 最新

  • Huazie 全栈领域优质创作者 2023-06-30 22:09
    关注

    这不是乱码,数据未正确被赋值,程序打印了未知的数据

    原因是 你的 %c 接受了 换行符,导致后续的数据接收都有问题

    先看截图:

    img

    改造如下:

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <stdlib.h>
    struct app
    {
        char gender;
        int agemin;
        int agemax;
        long incomemin;
        long incomemax;
        struct app* next;
    };
    int main()
    {
        int i, m;
        scanf("%d", &m);
        struct app* ahead = NULL;
        struct app* acur;
        struct app* aprev = NULL;
        for (i = 0; i < m; i++)
        {
            acur = (struct app*)malloc(sizeof(struct app));
            if (ahead == NULL)
                ahead = acur;
            else
                aprev->next = acur;
            acur->next = NULL;
            getchar(); // 接收一下换行符
            scanf("%c %d %d %ld %ld", &(acur->gender), &(acur->agemin), &(acur->agemax), &(acur->incomemin), &(acur->incomemax));        
            aprev = acur;
        }
        acur = ahead;
        for (i = 0; i < m; i++)
        {
            printf("%c %d %d %ld %ld", acur->gender, acur->agemin, acur->agemax, acur->incomemin, acur->incomemax);
            acur = acur->next;
            printf("\n");
        }
        acur = ahead;
        while (acur != NULL)
        {
            acur = ahead;
            ahead = acur->next;
            free(acur);
            acur = acur->next;
        }
        return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 7月9日
  • 已采纳回答 7月1日
  • 创建了问题 6月30日

悬赏问题

  • ¥15 Opencv配置出错
  • ¥15 模电中二极管,三极管和电容的应用
  • ¥15 关于模型导入UNITY的.FBX: Check external application preferences.警告。
  • ¥15 气象网格数据与卫星轨道数据如何匹配
  • ¥100 java ee ssm项目 悬赏,感兴趣直接联系我
  • ¥15 微软账户问题不小心注销了好像
  • ¥15 x264库中预测模式字IPM、运动向量差MVD、量化后的DCT系数的位置
  • ¥15 curl 命令调用正常,程序调用报 java.net.ConnectException: connection refused
  • ¥20 关于web前端如何播放二次加密m3u8视频的问题
  • ¥15 使用百度地图api 位置函数报错?