C 语言里的字符串---字符数组
首先要强调:
a. c语言有无字符串? 有!
b. c语言有无字符串类型 无!
c. c语言字符串是否就是不是字符数组 是!
b. c语言字符串和字符数组是同一样东西? 不是!
实际上, c语言中, 字符串是1个特殊的字符数组, 特殊在什么地方? 就是字符数组最后1个元素可以是任意字符, 而字符串(属于字符数组的最后1个元素是'\000',
也就是说, c
1.字符类型
char 就是c的字符类型
定义1个字符变量,跟住赋值.
char a;
a='a'; //这里只能用单引号, 双引号只能用于字符数组.
打印这个字符:
printf("char a is %c",a)
2.字符数组
由名字得知, 字符数组实际上是1个数组,其性质与数字型数组其实很类似的, 但是也有一些区别.
定义1个字符数组:
char c[5]; //:定义1个长度为5的字符数组, 也就是有5个字符元素啦
char c[]; // 错误,定义1个数组同时必须指定它的长度
赋值:
c[0]='a';c[1]='b';c[2]='c';c[3]='d';c[4]='e'; //正确
c ="abcde"; //错误
c={'a','b','c','d','e'}; //错误 因为c数组定义时已经设定了长度5, 而数组的长度一旦定义就不会改变, 所以c认为这种赋值不合法,因为有机会改变字符数组c的长度.
例子:
执行结果:
可以见到, 字符数组定义后, 赋值相当麻烦啊. 而且不像数字型赋值, 不方便循环赋值..
所以一般在定义1个字符数组语句同时执行赋值:
char c[]={'a','b','c','d','e'} // 正确
这样的话, 字符数组c在定义的同时它的各个元素和长度也被定义为5了.
char c[5]={'a','b','c','d','e'} //正确
char c[4]= {'a','b','c','d','e'} //错误, 制定长度为4, 但是赋予5个元素
char c[7]={'a','b','c','d','e'} //正确, 但是c[5]和c[6]这两个元素都被设为NULL '\000' 注意不是'0'啊
例子:
执行结果:
可以见到d的长度是6, 但是d[5]的值显示不出来, 因为上面已经提过, 如果赋值的元素个数少于数组长度, 后面的元素会自动被赋值成'\0', 而'\0'是个空字符.
debug一下就可以看清楚了:
而这时字符数组d就是1个字符串了, 因为他是以'\000'结尾的字符数组啊!
3.字符串
上面都提过很多次了, 字符串是以'\000' 结尾的字符数组.
定义1个字符串:
char c[]={'c','d','e','f','d','g','\000'}; // 长度为7
而实际上还可以这样定义:
char c[]="cdefdg" // 系统会自动补1个Null字符'\000'到这个字符串的最后1个元素, 长度也是7
char c[7]="cdefdg" //正确 这个是最常用的字符串变量赋值方法.
char c[6]="cdefdg" //这个不是字符串, 长度不足以容纳最后1个NULL字符'\000'
看个例子:
执行结果:
上面c 于d都是字符串, 因为他们都是'\000'结尾的, 而e是1个普通的字符数组:
函数sizeof返回的是数组长度, 它会将'\000'计算在内
而函数strlen返回的是字符串长度, 它不会计算'\000'在内 <string.h>
所以对于字符串来讲 sizeof(d) =7 它有7个元素嘛, 但是strlen长度只有6
而对于一般字符串(没有'\000'字符, sizeof 和 strlen 返回的结果是一样的)
现在我修改一下这个函数, 令
字符串c的第4个字符c[4]='\000':
执行结果:
可以见到 字符串c 居然显示3个字符"cde", 了 strlen长度也只有3
因为printf 函数 和strlen函数一样, 都会从字符数组的头1个元素往后面遍历, 当遇到'\000'时,就会认为这是1个字符串, 而且会在这里结束.
4. 一些指针的意思:
定义1个字符串:
char c[]="abcdef"; //
这样c就是1个长度为7的字符数组(也是字符串)c,c的元素包括 'a','b','c','d','e','f','\000', 上面已经解析过了.
而实际上, 跟int类型的数组名一样, 这里的字符串(也是字符数组)名字c本身就是1个字符型指针, 它指向数组c的一个的元素c[0]的地址.
也就是讲:
*c == c[0] = 'a'
*(c+1) = c[1] = 'b'
*(c+i) = c(i) //这个是经典公式啊.
也可以定义1个字符型指针*p
char *p;
给p赋值:
p=c; //因为数组名c也是指针啊, 所以不需要取址符&, p=&c;是错误的!
这样, p与c就是等价的(指向同1个地址
*p == c[0] = 'a' = p[0]
*(c+1) = c[1] = 'b' = p[1]
*(p+i) = p(i)=c(i) //这个是经典公式啊.
有另1个种定义数组的方法:
char *q = "abcdef" ,
这样指针q也是只向1个字符串. 用法跟上面指针p差不多
例子:
输出:
可以见到:
1. 用数组c的长度是7(sizeof(c)), 而字符串长度是6(strlen).
而用指针p去只想数组c, 求sizeof(p) 是多了1个元素的, 尾部多1个'\000',就是两个'\000'结尾啦, 但是字符串长度是一样的.
2. 可以见到 sizeof 和 strlen的参数实际上都是指针(c和p和q)都是指针.
所以在c语言中, 有很多函数的参数实际上都是指针, 这就是用地址传递产生了
例如
int strlen(char* p){ //这里char* p表示p是1个字符型参数, 而定义1个字符串p使用char *p;的 注意区别~
}
见到输出, p与q的部分是完全一样的,
是否p与q的用法就完全一样呢?
不是的
首先我定义字符串c时:
char c[]="abcdef"
这个c是1个字符串变量
那么p=c; p就指向1个字符串变量了
执行
p[1] = 'k';
p[2] ='h'; //都是合法的, 因为变量的值可以改变嘛
而定义1个字符指针q
char *p="abcdef"; 时
首先系统会定义1个字符串常量"abcdef",
然后指针p指向这个常量.
执行
q[1]='k'; 是不合法的, 因为常量的值不能修改, 所以里面的元素的值也不允许的修改的.
所以要定义1个字符串, 而且打算修改时 不要用
char *p="abcdef";
这种方式, 但是用于常量时就推荐这种~
C 语言里的字符串---字符数组相关推荐
- C语言字符型数组ppt,C语言第13讲指针与字符串(字符数组).ppt
C语言第13讲指针与字符串(字符数组).ppt 6.2.3 指针与字符串(字符数组) C语言用字符数组存放字符串. 字符数组元素个数确定,一般用下标控制循环. 字符串有效字符个数由0确定,用结束符0控 ...
- 字符串字符数组和基本类型的相互转换
1.基本类型转为字符数组或字符串 ❶整形转为字符数组: char *itoa(int value, char *string, int radix); value 将要被转换的值.string 转换的 ...
- JAVA关于字符串字符数组处理的小题目
JAVA关于字符串&&字符数组的小题目 第二题:分析以下需求,并用代码实现 1.键盘录入一个大字符串,再录入一个小字符串 2.统计小字符串在大字符串中出现的次数 3.代码运行打印格式: ...
- C++ 复制字符串/字符数组
题目 [项目1-小心地放开玩字符串/字符数组] (2)读程序,请分析其实现的功能 [cpp] view plaincopyprint? #include<iostream> usin ...
- java 字符串转list_浅谈java 字符串,字符数组,list间的转化
1.关于java.lang.string.split xxx.split()方法可以将一个字符串分割为子字符串,然后将结果作为字符串数组返回. 2.字符串转字符数组 String str =" ...
- 小心地放开玩字符串/字符数组(二)某类字符的个数
/* * Copyright (c) 2012, 烟台大学计算机学院 * All rights reserved. * 文件名称:test.cpp * 作 者:徐凯旋 * 完成日期:2012 年 12 ...
- 【C 语言】字符串操作 ( C 字符串 | 字符数组始化 )
文章目录 一.C 字符串 二.字符数组始化 一.C 字符串 C 字符串特征 : C 语言中的字符串都是以 '\0'字符 结尾的 字符数组 ; C 字符串本质 : C 中 没有字符串类型 , 都是使用 ...
- 字符串字符数组的赋值
字符数组的定义与初始化 Char str[10] = {'a','b','c','d','e'}; 如果说提供的字符的个数大于数组的长度,就按语法错误处理,如果小于数组的长度,不够的位置用空字符 ...
- C语言博客作业--字符数组
一.PTA实验作业 题目1:统计一行文本的单词个数 1. 本题PTA提交列表 2. 设计思路 Begin定义字符型变量ch,pre=' ': 定义整型变量count://用来记录单词个数 count← ...
最新文章
- C++ operator两种用法【转】
- Android运行时识别API版本
- How Tomcat Works(八)
- JAVA返回指定字符串的长度,Java截取指定字节长度的字符串
- 20210928 对角化的充要条件
- Java Persistence API:快速入门
- CTO 技术管理的“三板斧”
- UVA 2519 Radar Installtion
- orm设置bool型 python_详解python的ORM中Pony用法
- dell延长对显卡的保修服务
- 解决龙芯2F使用oprofile-0.9.7无法采样应用程序函数的问题
- mysql文章相似度计算_文章相似度计算
- 仿百度糯米TP5项目笔记
- Python 10个项目创意
- 中兴B863AV3.2-M、B863AV3.1-M2、E900V22C免拆机通刷救砖包【安卓9.0】
- 微信不显示王者荣耀连接服务器,王者荣耀省级不显示,王者荣耀不用微信怎么登录...
- 什么是Android手机
- 虚拟直播需要哪些设备?如何搭建虚拟直播团队?
- 求一个数的最小素因子外加快速分解质因子
- HSI、HSV、RGB、CMY、CMYK、HSL、HSB、Ycc、XYZ、Lab、YUV颜色模型(转)