C语言笔记21 字符串

字符数组

char word[] = {'H','e','l','l','o','!'};

|-----------|---|
| word[0] | H |
| word[1] | e |
| word[2] | l |
| word[3] | l |
| word[4] | o |
| word[5] | ! |

这不是C语言的字符串,只是字符数组,不能用字符串的方式做计算

字符串

char word[] = {'H','e','l','l','o','!','\0'};

|-----------|-----|
| word[0] | H |
| word[1] | e |
| word[2] | l |
| word[3] | l |
| word[4] | o |
| word[5] | ! |
| word[6] | \0 |

区别:\0,共有7个单元

  • 以0(整数0)结尾的一串字符(0或'\0'是一样的,但是和'0'不同)
  • 0标志字符串的结束,但它不是字符串的一部分,计算字符串长度的时候不包含0
  • 字符串以数组的形式存在,以数组或指针的形式访问(更多的是以指针)
  • string,h里有很多处理字符串的函数

字符串变量

char *str = "Hello";

char word[] = "Hello";

char line[10] = "Hello";

字符串常量"Hello"

"Hello"会被编译器变成一个字符数组放在某处,这个数组的长度是6(结尾还有0)

两个相邻的字符串常量会被自动连接起来

字符串

C语言的字符串是以字符数组的形态存在的

不能用运算符对字符串做运算,通过数组的方式可以遍历字符串

唯一特殊的地方是字符串字面量可以用来初始化字符数组

字符串变量

char* s = "Hello world!";

s是一个指针,初始化为指向一个字符串变量。由于这个常量所在的地方,所以实际上s是const char* s,但是由于历史的原因,编译器接受不带const的写法;但是试图对s所指的字符串做写入会导致严重的后果

如果需要修改字符串,需要用数组的方式:char s[] = "Hello world!";

指针or数组

**数组:**这个字符串在这里,作为本地变量自动被回收

**指针:**这个字符串不知道在哪里,用于处理参数、动态分布空间

*构造:数组;处理:指针

char*是字符串吗

字符串可以表达为char*的形式,但char*不一定是字符串

本意是指向字符串的指针,可能指向的是字符的数组(就像int*一样)

只有它所指的字符数组有结尾的0,才能说它所指的是字符串

字符串的输入输出

char string[8];

scanf("%s", string);

printf("%s", sting);

scanf读入一个单词(到空格、tab或回车为止)

这个scanf是不安全的,不知道要读入的内容的长度

安全写法:

char string[8];

scanf("%7s", string);

printf("%7s", sting);

在%和s之间的数字表示最多允许读入的字符的数量,这个数字应该比数组的大小小一

常见错误

char *string;

scanf("%s", sring);

以为char*是字符串类型,定义了一个字符串类型的变量string就可以直接使用了,由于没有对string初始化为0,所以不一定每次运行都出错

空字符串

char buffer[100]="";

这是一个空的字符串,bufffer[0] == "\0",依然是有效字符串

但char buffer[] = "";的数组长度只有1,只有buffer[0]是有效的

字符串数组

char **a:a是一个指针,指向另一个指针,那个指针指向一个字符(串)

char a[][]

程序参数

int main(int argc, char const *argv[])

argv[0]是命令本身,当使用Unix的符号连接时,反映符号链接的名字

相关推荐
Qinn-1 分钟前
【学习笔记】软考系统分析师计算机系统计算题考点
笔记
熊猫钓鱼>_>2 分钟前
GenUI:从“文本对话”到“可操作界面”的范式转移
开发语言·人工智能·agent·sdk·vibecoding·assistant·genui
Ulyanov10 分钟前
《玩转QT Designer Studio:从设计到实战》 QT Designer Studio环境搭建与核心工作区详解
开发语言·python·qt·系统仿真·雷达电子战系统仿真
枕星而眠14 分钟前
C 语言结构体硬核总结:内存对齐、#pragma pack、位段、柔性数组(面试+工程双指南)
c语言·后端·面试·柔性数组
前端摸鱼匠15 分钟前
【AI大模型春招面试题22】层归一化(Layer Norm)与批归一化(Batch Norm)的区别?为何大模型更倾向于使用Layer Norm?
开发语言·人工智能·面试·求职招聘·batch
历程里程碑19 分钟前
MySQL视图:虚拟表的实战技巧
java·开发语言·数据库·c++·sql·mysql·adb
lsx20240622 分钟前
Go 语言循环语句
开发语言
逻辑驱动的ken23 分钟前
Java高频面试考点场景题10
java·开发语言·深度学习·求职招聘·春招
曾几何时`25 分钟前
QT——对象树
开发语言·qt
埃伊蟹黄面26 分钟前
C++ —— 智能指针
开发语言·c++·算法