c语言之字符串数组

2023-11-16

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

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

运行结果

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

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c语言之字符串数组 的相关文章

  • 设计模式(一)

    1 适配器模式 1 概述 适配器中有一个适配器包装类Adapter 其包装的对象为适配者Adaptee 适配器作用就是将客户端请求转化为调用适配者中的接口 当调用适配器中的方法时 适配器内部会调用适配者类的方法 这个调用对客户端是透明 实现
  • Python爬虫技术及其原理探

    导言 随着互联网的发展 大量的数据被存储在网络上 而我们需要从中获取有用的信息 Python作为一种功能强大且易于学习的编程语言 被广泛用于网络爬虫的开发 本文将详细介绍Python爬虫所需的技术及其原理 并提供相关的代码案例 1 HTTP
  • Tomcat日志配置远程rsyslog采集

    Tomcat日志数据的采集有很多种方式 使用tail是最简单的方法 但必须保证catalina out日志中的每行都是以日期格式开头的 除了tail方法外 还可以通过对rsyslog配置实现 本博客主要通过配置rsyslog进行Tomcat
  • 经验分享:解决 错误0x80071AC3:无法完成操作,请运行chkdsk并重试

    在Windows系统电脑下 使用移动硬盘或者U盘复制拷贝文件的时候 如果遇到一个这样的提示 一个意外错误使您无法移动该文件夹 如果您继续收到此错误 可以使用错误代码来搜索有关此问题的帮助 错误0x80071AC3 无法完成操作 因为卷有问题

随机推荐

  • Unity shader系列:内置Shader代码查看

    官网下载 https unity3d com cn get unity download archive 对自己使用的unity版本进行下图操作
  • centos7 将home的空间扩容到根目录

    Centos7把home目录下多余的空间转移到 根目录下 通过df h发现 根目录只有35G 而home目录可用的 居然有19G 我现在想分出8G给根目录 把你需要挂载的机器的逻辑卷记住 上面的图 左边是逻辑卷 右边是虚拟磁盘 dev ma
  • 图像处理-State of the Art

    https github com BlinkDL BlinkDL github io 目前常见图像任务的 State of the Art 方法 从 Super resolution 到 Captioning CV 二维图像任务 Image
  • 【Java】【NIO】【04】通过SocketChannel读写Socket

    package easing common java demo import lombok SneakyThrows import java net InetSocketAddress import java nio ByteBuffer
  • 全局变量 multiple definition of 问题解决方法

    解决方法 1 给每一个头文件加上条件编译 注 此方法不是解决上述问题的方法 只是解决multiple definition of的一个方法 当多个文件包含同一个头文件时 而头文件中没有加上条件编译 就会独立的解释 然后生成每个文件生成独立的
  • 江西武功山旅游攻略(周末两日游)

    一 往返路线 1 出发路线 周五晚上上海出发坐火车 到江西萍乡 11 5小时 卧铺550左右 打车到江西武功山景区 120 150元左右 人均30元 1小时10分左右到达 或者 到达萍乡北之后 出站后步行200米到长途汽车站 乘旅游巴士直达
  • RestHighLevelClient初始化http参数的含义

    high level rest client 初始化 一般初始化时需要设置验证信息 http相关参数 Bean public RestHighLevelClient createClient return new RestHighLevel
  • etcd学习和实战:3、go使用etcd实现服务发现和管理

    etcd学习和实战 3 go使用etcd实现服务发现和管理 文章目录 etcd学习和实战 3 go使用etcd实现服务发现和管理 1 前言 2 代码及编译运行问题总结 2 1 服务注册 2 2 服务发现 2 3 问题 2 4 运行结果 1
  • 20数学建模校赛C题数据清理思路

    也就是这个看起来平平无奇的题目 我们觉得C题还能做 首先导入文件 导入库 import pandas as pd import numpy as np import matplotlib pyplot as plt from pandas
  • Linux系统基本操作及命令详解

    Linux系统基本操作及命令详解 前言 一 Linux命令基础 1 shell 1 1 shell概述 1 2 shell的作用 2 Linux命令的分类 2 1 内部命令与外部命令的区别 2 2 查看内部命令 2 3 禁用内部命令及重启内
  • 序列最小最优化算法(SMO算法)

    前面三篇我已经谈了谈我对支持向量机的理解 推到了各类支持向量机的对偶算法 我们有很多最优化算法来求解这个问题 但是样本容量很大时 这些算法会变得非常低效 人们就提出了很多快速实现算法 SMO算法就是其中之一 主要是用来解这个对偶问题 s t
  • PCL RANSAC拟合球体(C++详细过程版)

    目录 一 算法原理 二 代码实现 三 结果展示 一 算法原理 RANSAC拟合球体的算法原理已在其他博客中多次进行过详细描述 如PCL RANSAC拟合空间3D球体等 并且相关论文也很丰富 因此 这里不再做算法原理的重复阐述 本文重点在于使
  • 打印堆栈

    traceback print stack
  • SVN相关

    svn更新失败提示cleanup的解决方法 问题解决 https blog csdn net study4034 article details 80656882 注意关闭unity SVN更新后提示 One or more files a
  • 卷(二)C++___二刷

    Chapter 8 Type Conversion and Function Overloading 8 1 Implicit type conversion coercion The integer value 3 might be st
  • 合宙Air103

    基础资料 基于Air103开发板 Air103 LuatOS 文档 上手 开发上手 LuatOS 文档 探讨重点 对官方SPI FLASH demo中功能的复现 进行相关内容的学习及探讨 实现功能 功能 lua快速驱动 W25QXX XX代
  • windows:自定义内网ip后无法上网

    有可能能是ip冲突
  • Markdown给公式添加编号

    Markdown给公式添加编号 a 2 b 2 c 2 tag 1 2 由公式 1 2 即可得到结论
  • Eureka集群原理

    问题 微服务RPC远程服务调用最核心的是什么 高可用 试想你的注册中心只有一个only one 它出故障了那就呵呵o o了 会导致整个微服务环境不可用 解决办法 搭建Eureka注册中心集群 实现负载均衡 故障容错 Eureka集群的原理
  • c语言之字符串数组

    还是在写图的存储结构的时候 遇到了问题 就是如何在一个数组中存放字符串 我相信这个问题 对于面向对象的编程语言来说 轻而易举 比如对于Java来说 直接像下面就可以了 但是c语言没有String这个类型 能想到存放字符串的数据类型就是cha