当前位置:网站首页>c语言之字符串数组
c语言之字符串数组
2022-06-27 20:53:00 【悟空不买菜了】
还是在写图的存储结构的时候,遇到了问题,就是如何在一个数组中存放字符串,我相信这个问题
对于面向对象的编程语言来说,轻而易举,比如对于Java来说,直接像下面就可以了:

但是c语言没有String这个类型,能想到存放字符串的数据类型就是char* p = "love",指向常量空间里面的一个地址,我们说了,一级指针可以传递数组,换句话说,一级指针可以理解成传递了数组的首地址,然后就可以按照数组的方法进行遍历。
那么换句话来说,字符串可以表示为char*的形式,那么我用一个数组来存放char*不就行了嘛,那么存放一级指针的地址,就需要用到二级指针,用二级指针来保存一级指针的指向。
大致思想就是:

话不多说,直接上代码:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//直接用一个函数来初始化字符串数组
//传进来的是不是就是一个二级指针,这个指针保存了指针的地址
void init(char ***ppp)
{
//在堆上面分配一个char*的空间
//有多少个字符串就分配多大的空间
//这里我们开三个字符串在堆上面
*ppp =(char**) malloc(sizeof(char *) * 3);//指向了二级指针保存的位置
//开始循环为这段空间赋值
for (int i = 0; i < 3; i++) {
char str[1000] = { 0 };
scanf("%s", str);
//给数组指向的每一个节点分配相应字符串大小的空间
(*ppp)[i] = (char*)malloc(sizeof(char) * (strlen(str) + 1));
//把字符串内容拷贝到这个空间里面
strcpy((*ppp)[i], str);//指向这片char*的空间
}
//打印字符串
for (int i = 0; i < 3; i++) {
printf("%s\n",(*ppp)[i]);
}
}
int main()
{
char **pp;
init(&pp);//保存二级指针的地址
system("pause");
return 0;
}运行结果:

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

也就是在上面这个位置出现了问题,因为g.vertex[i]会造成内存地址访问出错,我们看看g的结构体的定义
很明显就是char *vertex[MAX_VERTEX] 定义错误,无法存放字符串数组啊,因为根本不能scanf初始化这个数组中的每一个值,下面我们写一个测试代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Graph
{
char** vertex;//去指向堆上面一片空间就行了
int vertex_num;
};
void test(Graph &g)
{
printf("请输入顶点个数:\n");
//分配多少个顶点
scanf("%d", &g.vertex_num);
//分配空间,根据顶点个数来分配空间
//返回的是一个一级指针的地址
g.vertex = (char**)malloc(sizeof(char*) * g.vertex_num);
//这个时候我们就可以赋值顶点了
printf("输入%d个顶点数:\n", g.vertex_num);
for (int i = 0; i < g.vertex_num; i++) {
//定一个字符串用于输入
char str[100] = { 0 };
scanf("%s", str);
//在堆上分配空间用于输入
//g.vertex这个东西啊,本身就是指向了一级指针,可以用啊
g.vertex[i] =(char*)malloc(sizeof(char) * (strlen(str) + 1));
//在进行一个字符串的拷贝
strcpy(g.vertex[i], str);//把str赋值到g.vertex[i]这个位置
}
}
void print(Graph &g)
{
for (int i = 0; i < 4; i++) {
printf("%s\n", g.vertex[i]);
}
}
void main3()
{
Graph g;
test(g);
print(g);
system("pause");
}我们之前的根本原因在于,无法初始化一个字符串数组,那么我们就动态在对上面分配一个空间,然后char*指向这个空间,我们就可以赋值了
运行结果

然后输入顶点的问题就解决了。
边栏推荐
- [electron] 基础学习
- 沉寂了一段时间 ,我又出来啦~
- Hiplot 在线绘图工具的本地运行/开发库开源
- This kind of people began to be robbed by VC with a monthly salary of 80000 yuan
- 官宣!Apache Doris 从 Apache 孵化器毕业,正式成为 Apache 顶级项目!
- 华为伙伴暨开发者大会2022 | 麒麟软件携手华为共建计算产业,共创数智未来
- 思源笔记订阅停止直接删云端数据嘛?
- 消除el-image图片周围间隙
- [electron] basic learning
- Using xgboost with tidymodels
猜你喜欢

The latest cloud development wechat balance charger special effect applet source code

捷码赋能案例:湖南天辰产研实力迅速提升!实战玩转智慧楼宇/工地等项目

Swing UI——容器(一)

How to set the enterprise wechat group robots to send messages regularly?

MSP430F5529 单片机 读取 GY-906 红外温度传感器

Azure Kinect DK 实现三维重建 (PC非实时版)

Discuz小鱼游戏风影传说商业GBK+UTF8版模板/DZ游戏网站模板

各种loam总结(激光slam)

未能加载文件或程序集“CefSharp.Core.Runtime.dll”或它的某一个依赖项。 不是有效的 Win32 应用程序。 (异常来自 HRESULT:0x800700C1)

PE buys a underwear company
随机推荐
Learn rnaseq analysis by following the archiving tutorial (I)
Redis principle - string
Typora 1.2.5等版本下载
凌云出海记 | 沐融科技&华为云:打造非洲金融SaaS解决方案样板
This kind of people began to be robbed by VC with a monthly salary of 80000 yuan
Follow the archiving tutorial to learn rnaseq analysis (IV): QC method for de analysis using deseq2
Livox lidar+apx15 real-time high-precision radar map reproduction and sorting
Azure Kinect DK realizes 3D reconstruction (Jetson real-time version)
「R」使用ggpolar绘制生存关联网络图
seata
Summary of solutions to cross system data consistency problems
To build a "strong core" in Nansha, the first IC Nansha conference was held in Nansha
go日志包 log的使用
[js]var, let, const
移动端避免使用100vh[通俗易懂]
Open source of local run / development library of hiplot online drawing tool
跟着存档教程动手学RNAseq分析(三):使用DESeq2进行计数标准化
How vivado adds timing constraints
6G显卡显存不足出现CUDA Error:out of memory解决办法
Discuz small fish game wind shadow legend business gbk+utf8 version template /dz game website template