c语言之字符串数组

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

对于面向对象的编程语言来说,轻而易举,比如对于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*指向这个空间,我们就可以赋值了

运行结果

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

  • 9
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值