c语言输出格式问题提问

img


为什么c1和c2输出的是问号呢?,难道是电脑不能识别哪两个阿斯克码的字符嘛?

  • char 类型 的范围是 -128 ~ 127 , 197和 198 显然存不下,那它的二进制如下,要想存下,就只能是 负数,而ascii码是 0 ~ 127 范围,打印负数的char 就是 乱码的问号 【无法识别的字符】?

img

  • 197的 二进制如上, 要想存到 char里,只能是 负数, 那就是二进制的 第一位的 1 为 符号位, 其它的位是 补码,先转成 反码【补码 - 1 】,然后反码 再转换成 原码 【1 变成 0, 0变成 1】
// 负数
补码 11000101
反码 11000100
原码 10111011

img

  • 再加上一个符号位,就是 -59
不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7788021
  • 你也可以参考下这篇文章:C语言编程输出不同整型数据类型在内存中占的字节数
  • 同时,你还可以查看手册:c语言-字符串字面量 中的内容
  • 除此之外, 这篇博客: C语言邻接表表示法创建无向图并输出中的 C语言邻接表表示法创建无向图并输出 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    邻接表是图的一种链式存储结构,对图的每个顶点建立一个单链表,单链表第一个结点存放顶点信息,其余存放有关边信息。
    邻接表由表头结点表和边表组成。
    在这里插入图片描述

    • 邻接表存储结构
    #include <stdio.h>
    #include <stdlib.h>
    //- - - - -图的邻接表存储表示- ----
    #define MAX 100   //最大顶点数
    typedef struct ArcNode   //边结点
    {  
        int adjvex;  //边顶点位置	  
        struct ArcNode * nextarc;
    }ArcNode;
    typedef struct VNode  //顶点
    {
       char data;
       ArcNode * firstarc;
    }VNode;
    typedef struct
    {
        VNode AdjList[ MAX ];
        int vexnum,arcnum;  //图的当前顶点数和边数
    }ALGraph;
    
    • 创建无向图
    算法步骤:
    1、输入总顶点数和总边数
    2、依次输入顶点信息存入顶点表中,并使表头结点的指针域初始化为NULL
    3、创建邻接表。依次输入每条边依附的两个顶点,确定两个顶点的序号,将此边结点插入对应的边链表头部。
    
    int LocateVex(ALGraph G,char v) //根据v点信息,找到相应坐标
    {
       for(int i=0;i<G.vexnum;++i)
       {
           if(G.AdjList[i].data==v)
            return i;
       }
       return -1;
    }
    
    int CreateUDG(ALGraph * G)
    {
        char v1,v2;
        int i,j;
        ArcNode *p1,*p2;
        printf("输入顶点数和边数");
        scanf("%d%d",&G->vexnum,&G->arcnum);
        
        printf("输入顶点数据:");
        for(int c=0;c<G->vexnum;++c)
        {
            scanf(" %c", &G->AdjList[c].data);  //%c前面空格就是用来屏蔽空白符的
            G->AdjList[c].firstarc=NULL;       //在用"%c"输入时,空格和“转义字符”均作为有效字符
        }
        printf("输入边的两个顶点\n");
        for(int k=0;k<G->arcnum;++k)
        {
            scanf(" %c %c",&v1,&v2);
            i=LocateVex(*G,v1);  //确定顶点位置
            j=LocateVex(*G,v2);
            
            p1=(ArcNode*)malloc(sizeof(ArcNode));  //p1插入边表头部
            p1->adjvex=i;
            p1->nextarc=G->AdjList[j].firstarc;  //链表前插法
            G->AdjList[j].firstarc=p1;
            
            p2=(ArcNode*)malloc(sizeof(ArcNode));
            p2->adjvex=j;
            p2->nextarc=G->AdjList[i].firstarc;
            G->AdjList[i].firstarc=p2;
        }
        return 0;
    }
    
    
    • 输出图的邻接表
    void output_AL(ALGraph G)  //输出
    {
          for(int i=0;i<G.vexnum;i++)
        {
            printf("顶点%c",G.AdjList[i].data);
            ArcNode * p=G.AdjList[i].firstarc;
            while(p!=NULL)
            {
                printf("->%d",p->adjvex); //输出下标
                //printf("->%c",G.AdjList[p->adjvex].data);  //输出顶点元素
                p=p->nextarc;
             }
            printf("\n");
        }
    }
    
    • 主函数
    int main()
    {
        ALGraph G;
        CreateUDG(&G);
        output_AL(G);
        return 0;
    }
    
    • 运行结果
      在这里插入图片描述
  • 您还可以看一下 贺利坚老师的C语言及程序设计初步课程中的 数值型数据的存储小节, 巩固相关知识点

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^