• c语言之字符串数组


    还是在写图的存储结构的时候,遇到了问题,就是如何在一个数组中存放字符串,我相信这个问题

    对于面向对象的编程语言来说,轻而易举,比如对于Java来说,直接像下面就可以了:

     但是c语言没有String这个类型,能想到存放字符串的数据类型就是char* p = "love",指向常量空间里面的一个地址,我们说了,一级指针可以传递数组,换句话说,一级指针可以理解成传递了数组的首地址,然后就可以按照数组的方法进行遍历。

    那么换句话来说,字符串可以表示为char*的形式,那么我用一个数组来存放char*不就行了嘛,那么存放一级指针的地址,就需要用到二级指针,用二级指针来保存一级指针的指向。

    大致思想就是:

    话不多说,直接上代码:

    1. #define _CRT_SECURE_NO_WARNINGS
    2. #include <stdio.h>
    3. #include <stdlib.h>
    4. #include <string.h>
    5. //直接用一个函数来初始化字符串数组
    6. //传进来的是不是就是一个二级指针,这个指针保存了指针的地址
    7. void init(char ***ppp)
    8. {
    9. //在堆上面分配一个char*的空间
    10. //有多少个字符串就分配多大的空间
    11. //这里我们开三个字符串在堆上面
    12. *ppp =(char**) malloc(sizeof(char *) * 3);//指向了二级指针保存的位置
    13. //开始循环为这段空间赋值
    14. for (int i = 0; i < 3; i++) {
    15. char str[1000] = { 0 };
    16. scanf("%s", str);
    17. //给数组指向的每一个节点分配相应字符串大小的空间
    18. (*ppp)[i] = (char*)malloc(sizeof(char) * (strlen(str) + 1));
    19. //把字符串内容拷贝到这个空间里面
    20. strcpy((*ppp)[i], str);//指向这片char*的空间
    21. }
    22. //打印字符串
    23. for (int i = 0; i < 3; i++) {
    24. printf("%s\n",(*ppp)[i]);
    25. }
    26. }
    27. int main()
    28. {
    29. char **pp;
    30. init(&pp);//保存二级指针的地址
    31. system("pause");
    32. return 0;
    33. }

     运行结果:

    于是我去解决一下我的图的存储结构里面发生的段错误的问题

     也就是在上面这个位置出现了问题,因为g.vertex[i]会造成内存地址访问出错,我们看看g的结构体的定义

     

    很明显就是char *vertex[MAX_VERTEX] 定义错误,无法存放字符串数组啊,因为根本不能scanf初始化这个数组中的每一个值,下面我们写一个测试代码

    1. #define _CRT_SECURE_NO_WARNINGS
    2. #include <stdio.h>
    3. #include <stdlib.h>
    4. #include <string.h>
    5. struct Graph
    6. {
    7. char** vertex;//去指向堆上面一片空间就行了
    8. int vertex_num;
    9. };
    10. void test(Graph &g)
    11. {
    12. printf("请输入顶点个数:\n");
    13. //分配多少个顶点
    14. scanf("%d", &g.vertex_num);
    15. //分配空间,根据顶点个数来分配空间
    16. //返回的是一个一级指针的地址
    17. g.vertex = (char**)malloc(sizeof(char*) * g.vertex_num);
    18. //这个时候我们就可以赋值顶点了
    19. printf("输入%d个顶点数:\n", g.vertex_num);
    20. for (int i = 0; i < g.vertex_num; i++) {
    21. //定一个字符串用于输入
    22. char str[100] = { 0 };
    23. scanf("%s", str);
    24. //在堆上分配空间用于输入
    25. //g.vertex这个东西啊,本身就是指向了一级指针,可以用啊
    26. g.vertex[i] =(char*)malloc(sizeof(char) * (strlen(str) + 1));
    27. //在进行一个字符串的拷贝
    28. strcpy(g.vertex[i], str);//把str赋值到g.vertex[i]这个位置
    29. }
    30. }
    31. void print(Graph &g)
    32. {
    33. for (int i = 0; i < 4; i++) {
    34. printf("%s\n", g.vertex[i]);
    35. }
    36. }
    37. void main3()
    38. {
    39. Graph g;
    40. test(g);
    41. print(g);
    42. system("pause");
    43. }

    我们之前的根本原因在于,无法初始化一个字符串数组,那么我们就动态在对上面分配一个空间,然后char*指向这个空间,我们就可以赋值了

    运行结果

    然后输入顶点的问题就解决了。 

     

  • 相关阅读:
    思迈特软件蝉联IDC中国Fintech 50强,金融科技实力再获认可!
    java毕业设计云端存储的待办清单的设计Mybatis+系统+数据库+调试部署
    CodeTON Round 3 (Div. 1 + Div. 2, Rated, Prizes!) E. Bracket Cost(思维 括号匹配)
    聊聊kube-scheduler如何完成调度和调整调度权重
    精彩,Excel成为编程语言,国产重量级选手再也坐不住了
    java毕业设计电动机营销系统Mybatis+系统+数据库+调试部署
    基于php的物流系统设计与实现
    Ubuntu20.0工作区(workspace)介绍,切换工作区方式和快捷键
    RabbitMQ学习笔记(二)SpringAMQP的使用、消息转换器
    从零开始配置 vim(9)——初始配置
  • 原文地址:https://blog.csdn.net/Pxx520Tangtian/article/details/125462122