c语言相邻字符串字面量,C语言入门-字符串

还是要继续学习,每天给自己打气。

字符数组

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

这不是c语言的字符串,不能用字符串的方式做计算

一、字符串

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

区别就是最后多了一个0,这就成为了字符串

以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!";

指针还是数组

char *str = "hello";

char word[] = "hello";

数组:可以读,可以写

指针:只能读,不能修改

如果要构造一个字符串 ------>数组

如果要处理一个字符串 ------>指针

char*是字符串

字符串可以表达为char*的形式

char*不一定是字符串

本意是指向字符串的指针,可能指向的是字符的数组

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

#include

int main(void)

{

char *s = "hello world";

char *s1 = "hello world";

char s3[] = "hello world";

// 这个是不能修改的

// s[0] = 'b';

s3[0] = 'b';

printf("%p\n", s);

printf("%p\n", s1);

printf("%p\n", s3);

printf("here! s[0]=%c\n", s[0]);

printf("here! s3[0]=%c\n", s3[0]);

// 0000000000404000

// 0000000000404000

// 000000000062fe30

// here! s[0]=h

// here! s3[0]=b

return 0;

}

三、字符串的输入和输出

字符串赋值

char *t = 'title';

char *s;

s = t;

并没有产生新的字符串,只是让指针s指向了t所指的字符串,对s的任何操作就是对t做的

字符串输入和输出

char string[8];

scanf("%s" , string);

printf("%s" , string);

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

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

常见错误

char *string;

scanf("%s" , string);

以为char*是字符串类型,定义了一个字符串类型的变量string就可以直接使用了

由于没有对string初始化0 , 所以不一定每次运行都出错

四、单字符输入和输出

int putchar(int c);

向标准输出写一个字符

返回写了几个字符,eof(-1)表示写失败

int getchar(void);

从标准输入读入一个字符

返回类型是int是为了返回eof(-1) windows --->ctrl-z

五、字符串函数strlen

size_t strlen(const char *s);

返回s的字符串长度(不包括结尾的0)

#include

#include

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

{

char line[] = "hello";

printf("strlen=%lu\n", strlen(line));

printf("sizeof=%lu\n", sizeof(line));

return 0;

}

//strlen=5

// 这个包括了字符串最后的0

//sizeof=6

当然了,也可以自己写一个函数来计算字符串长度

#include

#include

// 自定义方法来计算字符串长度

int mylen(const char *s)

{

int idx = 0;

while ( s[idx] != '\0' ){

idx++;

}

return idx;

}

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

{

char line[] = "hello";

printf("strlen=%lu\n", mylen(line));

printf("sizeof=%lu\n", sizeof(line));

return 0;

}

六、字符串函数strcmp

int strcmp(const char s1 , const chars2);

比较两个字符串返回:

0:s1 == s2

1: s1 > s2

-1: s1 < s2

七、字符串函数strcpy

char* strcpy(char restrict dst , const char restrict src);

把src的字符串拷贝到dst

restrict表明src和dst不重叠(c99)

返回dst,为了能连起代码来

复制一个字符串

char *dst = (char*)malloc(strlen(src)+1);

strcpy(dst , src);

八、字符串strcat

char* strcat(char restrict s1 , const charrestrict s2);

把s2拷贝到s1的后面,接成一个长的字符串

返回s1

s1必须具有足够的空间

但是这些函数都是不安全的,因为你不知道有没有足够的空间,所以

安全版本:如图

94388da177ef83eaf81a4b199c67f7a4.png

九、字符串搜索函数

char * strchr(const char *s , int c);

char * strrchr(const chat *s int c);

返回null表示没有找到

#include

#include

#include

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

{

char s[] = "hello";

char *p = strchr(s, 'l');

// 找到第二个l

p = strchr(p+1,'l');

printf("%s\n", p);

return 0;

}

复制给另一个

#include

#include

#include

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

{

char s[] = "hello";

char *p = strchr(s, 'l');

char *t = (char*)malloc(strlen(p)+1);

strcpy(t,p);

printf("%s\n", t);

free(t);

// llo

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值