C语言,字符数组与字符串

article/2025/9/1 14:53:24

文章目录

  • 字符数组基本介绍
  • 字符串注意事项
  • 字符串的访问和遍历
  • 字符串的表示形式
    • 用字符数组存放一个字符串: 用字符数组存放一个字符串,
    • 用字符指针指向一个字符串
    • 使用字符指针变量和字符数组两种方法表示字符串的讨论
  • 字符串相关函数
    • 常用字符串函数一览
    • 字符串函数应用案例
  • 字符串(字符数组)使用注意事项和细节
  • 字符串(字符数组)课堂练习

字符数组基本介绍

用来存放字符的数组称为字符数组, 看几个案例

1)char a[10]; //一维字符数组, 长度为 10
2)char b[5][10]; //二维字符数组, 后面我们详细介绍二维数组
3)char c[20]={‘c’, ’ ', ‘p’, ‘r’, ‘o’, ‘g’, ‘r’, ‘a’,‘m’}; // 给部分数组元素赋值

字符数组实际上是一系列字符的集合,也就是字符串(String)。在 C 语言中,没有专门的字符串变量,没有 string 类型,通常就用一个字符数组来存放一个字符串。

字符串注意事项

1)在 C 语言中,字符串实际上是使用 null 字符 (’\0’) 终止的一维字符数组。因此,一个以 null 结尾的字符串, 包含了组成字符串的字符。
2)’\0’是 ASCII 码表中的第 0 个字符,用 NUL 表示,称为空字符。该字符既不能显示,也不是控制字符,输出该 字符不会有任何效果,它在 C 语言中仅作为字符串的结束标志。
3)字符数组(字符串)在内存中的布局分析 [案例]

在这里插入图片描述
4)思考 char str[3] = {‘a’,‘b’,‘c’} 输出什么? 为什么?
输出abc

结论:如果在给某个字符数组赋值时,
(1)赋给的元素的个数小于该数组的长度,则会自动在后面加 ‘\0’, 表示 字符串结束,
(2)赋给的元素的个数等于该数组的长度,则不会自动添加 ‘\0’
char str2[] = {‘t’,‘m’,‘o’} 输出什么? 输出的是 tmo 乱码

5)案例演示

#include <stdio.h> 
void main() { //c 是一个一维字符数组,给部分元素赋值 char c[7]={'t','o','m'}; char str[4] = {'a','b','c'}; char str2[] = {'j','a','c','k'}; // 这个后面系统也不会自动添加 '\0' char str3[] = {'t','m','o'};//输出 c , 系统会这样处理 //1. 从第一个字符开始输出,直到遇到 \0 , 表示该字符串结束 printf("\nc=%s", c); printf("\nstr=%s", str); // abc? printf("\nstr2=%s", str2); // jack 乱码 printf("\nstr3=%s", str3); // }

字符串的访问和遍历

因为字符串的本质就是字符数组,因此可以按照数组的方式遍历和访问某个元素即可, 案例如下

#include <string.h> 
#include <stdlib.h> 
#include <stdio.h> void main() { char greeting[] = "Hello"; //如果将char greeting[] 改成 char* greeting 对下列式子无任何变化int i; //strlen 获取字符数组长度 int len = strlen(greeting); // len = 5 printf("\ngreeting=%s", greeting); printf("\nlen=%d", len); //5 printf("\n 字符串第 3 个字符是=%c", greeting[2]); //l printf("\n"); for(i = 0; i < len; i++) { //遍历 printf("%c ", greeting[i]); //H e l l o }system("pause"); 
}

对应的内存分析图在这里插入图片描述

字符串的表示形式

用字符数组存放一个字符串: 用字符数组存放一个字符串,

1 )char str[]=“hello tom”;
2)char str2[] = {‘h’, ‘e’};

用字符指针指向一个字符串

比如:char* pStr=" hello tom";

1)C 语言对字符串常量" hello tom"是按字符数组处理的,在内存中开辟了一个字符数组用来存放字符串常量,程 序在定义字符串指针变量 str 时只是把字符串首地址(即存放字符串的字符数组的首地址)赋给 pStr
2)printf("%s\n",str); 可以输出 str 指向的字符串
3)对应的内存布局图(!!)

在这里插入图片描述

使用字符指针变量和字符数组两种方法表示字符串的讨论

1)字符数组由若干个元素组成,每个元素放一个字符;而字符指针变量中存放的是地址(字符串/字符数组的首地址),绝不是将字符串放到字符指针变量中(是字符串首地址)
2)对字符数组只能对各个元素赋值,不能用以下方法对字符数组赋值

char str[14]; 
str=" hello tom"; //错误  str是常量
str[0] = 'i'; //ok

3)对字符指针变量,采用下面方法赋值, 是可以的

char* a="yes"; 
a=" hello tom";

a本身的地址不会发生变化,a指向的地址会发生变化

a本身的地址 -> &a ,a 指向的地址 a
printf(“a本身的地址为 %p,a指向的地址为 %p”, &a,a);

4)分析上面的结论

在这里插入图片描述
5) 如果定义了一个字符数组,那么它有确定的内存地址(即字符数组名是一个常量);而定义一个字符指针变量时, 它并未指向某个确定的字符数据,并且可以多次赋值

字符串相关函数

常用字符串函数一览

序号函数&目的
1strcpy(s1,s2);复制字符串s2到字符串s1
2strcat(s1,s2); 连接字符串s2到字符串s1的末尾
3strlen(s1);返回字符串s1的长度
4strcmp(s1,s2);如果s1,s2相同,则返回0,如果s1 < s2 则小于 0 如果s1 > s2 则大于0
5strchr(s1,ch);返回一个指针,指向字符串s1中字符ch的第一次出现的位置
6strstr(s1,s2);返回一个指针,指向字符串s1中的字符串s2第一次出现的位置

字符串函数应用案例

#include <stdio.h> 
#include <string.h> void main() { char str1[12] = "Hello"; char str2[12] = "World"; char str3[12]; int len ; // 复制 str1 到 str3  strcpy(str3, str1); // str3 内容 "Hello" printf("strcpy( str3, str1) : %s\n", str3 ); //"Hello" // 连接 str1 和 str2 strcat( str1, str2); printf("strcat( str1, str2): %s\n", str1 ); //"HelloWorld"// 连接后,str1 的总长度len = strlen(str1);// printf("strlen(str1) : %d\n", len );//10 }

在这里插入图片描述

字符串(字符数组)使用注意事项和细节

1) 程序中往往依靠检测 ‘\0’ 的位置来判定字符串是否结束,而不是根据数组的长度来决定字符串长度。因此,字 符串长度不会统计 ‘\0’, 字符数组长度会统计 [案例]
2) 在定义字符数组时应估计实际字符串长度,保证数组长度始终大于字符串实际长度, 否则,在输出字符数组 时可能出现未知字符.
3)系统对字符串常量也自动加一个’\0’作为结束符。例如"C Program”共有 9 个字符,但在内存中占 10 个字节, 最后一个字节’\0’是系统自动加上的。(通过 sizeof()函数可验证)
4)定义字符数组时,如果 给的字符个数 比 数组的长度小,则系统会默认将剩余的元素空间,全部设置为 ‘\0’, 比 如 char str[6] = “ab” , str 内存布局就是 [a][b][\0][\0][\0][\0]
5)字符数组定义和初始化的方式比较多,比如

#include <stdio.h> void main() { char str1[ ]={"I am happy"}; // 默认后面加 '\0' char str2[ ]="I am happy"; // 省略{}号 ,默认后面加 '\0'char str3[ ]={'I',' ','a','m',' ','h','a','p','p','y'}; // 字符数组后面不会加 '\0', 可能有乱码 char str4[5]={'C','h','i','n','a'}; //字符数组后面不会加 '\0', 可能有乱码 char * pStr = "hello";//ok printf("\n str1=%s", str1); printf("\n str2=%s", str2);//ok printf("\n str3=%s", str3);//乱码 printf("\n str4=%s", str4);//乱码
}

字符串(字符数组)课堂练习

char str[ ]; 
str="I am happy"; 

题 1 错误,因为 str 是常量


http://chatgpt.dhexx.cn/article/Zw4wukOI.shtml

相关文章

浅谈字符数组

文章目录 一、什么是字符数组二、字符数组的定义和赋值1. 先定义一个数组&#xff0c;再为挨个元素进行赋值2. 在定义的同时给该字符数组进行初始化2.1 错误的初始化方式2.2 正确的初始化方式 3. 特别注意&#xff01;&#xff01;&#xff01;3.1 字符数组和整型数组一样不支持…

字符数组

字符数组 用来存放字符数据的数组是字符数组。字符数组中的每一个元素存放一个字符&#xff0c;其定义和使用方法与其他类型的数据基本相似。 1.1字符数组的定义和使用 字符数组的定义与其他类型的数组类似&#xff0c;标准形式如下&#xff1a; Char 数组名 【常量表达式】 …

Stata:嵌套Logit模型(NestedLogit)

原文链接&#xff1a;https://www.lianxh.cn/news/d5e00bfb17a7c.html 致谢&#xff1a; 这篇推文的核心内容主要来自陈强老师编著的《高级计量经济学及 Stata 应用》一书&#xff0c;特此致谢。 1. 简介 此前&#xff0c;连享会发布了一系列离散选择模型相关的推文&#xff0…

MNL——多项Logit模型学习笔记(二)

本节将会通过案例举例&#xff0c;介绍Logit模型的建模思路和过程 内容为摘抄他人学习资料的个人学习笔记&#xff0c;如有侵权则删 1.正确打开/解读Logit模型系数的方式 本节的具体内容在笔记里不详细表示了&#xff0c;大家在软件里拟合Logit模型时&#xff0c;对于其中的参…

logit回归模型的参数估计过程_【DCM07】Random Parameter(随机参数)Logit模型及其Nlogit实现...

本文是离散选择模型系列的第7篇原创文章,将详细介绍随机参数Logit模型,并利用Nlogit软件进行实操演示。【关注本公众号,可以获取数据和代码】本文公式较多,建议电脑端享用。 目录 1、随机参数Logit模型介绍 2、数据描述 3、随机参数Logit模型的参数估计 1 随机参数Logit模型…

MNL——多项Logit模型学习笔记(三)二项Logit模型、Gumble分布以及Logistic分布

上一节最后一部分&#xff0c;介绍了Provit模型&#xff0c;从建模的角度来说&#xff0c;Probit模型假设随机项服从正态分布&#xff0c;这是具有一定的合理性的——也是其优点&#xff1b;但是Probit模型没有闭合解——每次算P(n)i 的值的时候都需要求积分&#xff0c;这就给…

模型与logit_互助问答第33期:条件logit模型相关问题

问题: 尊敬的老师,您好!我最近在做一个条件logit模型的实证研究,因为是非线性的二元响应模型,查了很久的文献和Stata资料也没找到检查这类模型异方差的方法以及处理异方差的办法,请您们帮忙分析下,谢谢!如果可以的话,希望您能给出Stata命令,再次感谢! 答案: 第一,…

logit模型应用实例_互助问答第240期:面板Logit模型

您好老师,我是暨南大学国际商务专业的一名应届毕业生,有一个问题思考了很久都没办法解决,所以想要向你们求助。具体情况如下:我的论文采用的是面板logit模型,在判断使用固定效应和随机效应的过程中,我分别用命令xtlogit y x1 x2 x3,fe和xtlogit y x1 x2 x3,re得到了固定…

Logit模型和Logistic模型

一、离散选择模型&#xff08;Discrete Choice Model, DCM&#xff09; 常见的DCM模型&#xff1a;二项Logit&#xff08;Binary Logit&#xff09;、多项Logit&#xff08;Multi-nominal Logit&#xff09;、广义Logit&#xff08;Generalized Logit&#xff09;、条件Logit&a…

logit回归模型_是或否,Logit模型详解以及论文实践

目录 1.Logit和Probit的模型差别 2.二分类Logistic回归模型 3.多分类Logistic回归模型 4.次序Logistic回归模型 5.面板数据Logistic回归模型 Logit回归(又称逻辑回归、罗杰斯蒂回归、Logistic回归)无疑是社会科学,尤其是社会学研究中使用最广的方法,没有之一。这也是因为…

【Python计量】Logit模型

文章目录 一、离散选择模型二、Logit模型三、Logit模型的python实现——采用statsmodels&#xff08;一&#xff09;案例一&#xff08;二&#xff09;案例二 此文章首发于微信公众号Python for Finance 链接&#xff1a;https://mp.weixin.qq.com/s/EeT84koL1ZAAQe5yZALuzw 一…

OGNL表达式学习笔记

OGNL表达式是一个独立的语言&#xff0c;strut2将其引入共同构造struts2。 OGNL语言强大于EL表达式&#xff0c;其可以访问java类中的对象&#xff0c;也可以访问对象的静态方法。 public class OgnlDemo1 {Testpublic void test1() throws OgnlException{OgnlContext contex…

ognlognl表达式 研究

为了解决数据从View层传递到Controller层时的不匹配性&#xff0c;Struts2采纳了XWork的OGNL方案。并且在OGNL的基础上&#xff0c;构建了OGNLValueStack的机制&#xff0c;从而比较完美的解决了数据流转中的不匹配性。 OGNL&#xff08;Object Graph Navigation La…

ognl表达式的研究

OGNL —— 完美的催化剂 为了解决数据从View层传递到Controller层时的不匹配性&#xff0c;Struts2采纳了XWork的OGNL方案。并且在OGNL的基础上&#xff0c;构建了 OGNLValueStack的机制 &#xff0c;从而比较完美的解决了数据流转中的不匹配性。 …

OGNL表达式原理及使用

OGNL &#xff1a;object graph navigation language&#xff0c;对象图形导航语言&#xff0c;一种表达式语言。 为什么出现&#xff1a; 在我们所熟悉的mvc框架中&#xff0c;数据是在各层之间进行流转使用的。 显示层&#xff1a;将数据展示给用户&#xff0c;数据…

OGNL表达式的介绍

OGNL OGNL的简介OGNL与EL表达式的区别OGNL案例OGNL向ValueStack压栈 OGNL的简介 OGNL是对象 - 图形导航语言&#xff08;Object Graph Navigation Language&#xff09;的缩写&#xff0c;它是一种功能强大的表达式语言&#xff0c;通过它简单一致的表达式语法&#xff0c;可以…

Arthas--ognl表达式

背景 arthas执行ognl表达式&#xff0c;获取对应的jvm对象数据。ognl学习&#xff0c;可以查看上篇&#xff1a;https://xiaopanjia.blog.csdn.net/article/details/130425414 基本语法 ognl express -c {hashCode} --classLoaderClass {当前的全路径 ClassLoader 信息} -x …

OGNL表达式语言详解

众所周知&#xff0c;OGNL充斥在Struts2前后台数据传递与存储的方方面面&#xff0c;给Struts2中数据的处理带来了极大的方便&#xff0c;所以&#xff0c;本次打算以两篇博客来介绍OGNL&#xff0c;第一篇就是脱离MVC框架&#xff0c;单纯介绍OGNL的一般用法和语法&#xff0c…

计算机的系统总线

系统总线及控制 一、总线的基本概念1、总线定义2、信息传送方式3、总线结构 二、总线的分类根据总线的位置进行分类 三、总线特性及性能指标1、总线特性2、总线的性能指标 四、总线结构1、单总线结构2、多总线结构(1) 双总线结构(2) 三总线结构(3) 三总线结构的另一种形式(4) 四…

总线——概念与分类

文章目录 总线的定义为什么要用总线&#xff1f; 总线的特点总线的特性总线的分类串行总线与并行总线串行总线优缺点 并行总线优缺点 按总线功能1. 片内总线2. 系统总线3. 通信总线&#xff08;外部总线&#xff09;补&#xff1a;系统总线的结构单总线结构双总线结构三总线结构…