字符串学习之路

一.字符数组

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

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

1.字符串

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

    字符串

1.1字符串

  • 以0(整数0)结尾的一串字符

    • 0或'\0'是一样的,但是和'0'不同

  • 0标志字符串的结束,但它不是字符串的一部分

    • 计算字符串长度的时候不包括这个0

  • 字符串以数组的形式存在,以数组或指针的形式访问

    • 更多的是以指针的形式

  • string.h里有很多处理字符串的函数

3.字符串变量

  • char *str = "Hello";

  • char word[ ] = "Hello";

  • char line[10] = "Hello";

4.1字符串常量

  • "Hello"

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

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

C语言的字符串是以字符数组的形态存在的,不能用运算符对字符串做运算,通过数组的方式可以遍历字

  • 唯一特殊的地方是字符串字面量可以用来初始化字符数组,以及标准库提供了一系列字符串函数

4.2 字符串常量

char *s = "Hello, world!";

  • s 是一个指针,初始化为指向一个字符串常量,由于这个常量所在的地方,实际上sconst char* s,但是由于历史的原因,编译器接受不带const的写法

  • 但是试图对s所指的字符串做写入会导致严重的后果

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

5.字符串用指针还是数组

char *str = "Hello"; char word[] = "Hello";

  • 数组:这个字符串在这里。

    • 1.作为本地变量空间自动被收回

  • 指针:这个字符串不知道在哪里。

    • 1.处理参数。2.动态分配空间

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

  • char*不一定是字符串

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

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


二.字符串输入输出

1.字符串赋值?

  • char *t = "title";

  • char *s;

  • s = t;

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

2.字符串输入输出

  • char string[8];

  • scanf("%s", string);

  • printf("%s", string);

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

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

3.安全的输入

  • char string[8];

  • scanf("%7s", string);

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

4.常见错误

  • char *string;

  • scanf("%s", string);

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

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

5.空字符串

  • char buffer[100]="";

    • 这是一个空的字符串,buffer[0]=='\0'

  • char buffer[ ]="";

    • 这个数组的长度只有1!


三.字符串数组

  • char **a;

    • a是一个指针,指向另一个指针,那个指针指向一个字符(串)

  • char ;

程序参数

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

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


四.单字符的输入输出

1.putchar

  • int putchar(int c);

  • 向标准输出写一个字符

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

2.getchar

  • int getchar(void);

  • 从标准输入读入一个字符

  • 返回类型是int,是为了返回EOF(-1) Windows --> Ctrl-Z; Unix --> Ctrl-D


五.字符串函数

1.string.h

  • strlen

  • strcmp

  • strcpy

  • strcat

  • strchr

  • strstr #include <string.h>

strlen

  • size_t strlen(const char* s);

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

int mylen(const char* s)
{
  int idx = 0;
  while (s[idx] != '\0'){
    idx++;
  }
  return idx;
}

strcmp

  • int strcmp(const char *s1,const char *s2);

  • 比较两个字符串,返回:

    • 0 ———> s1==s2

    • 1 ———> s1>s2

    • -1 ———> s1<s2

int mycmp(const char* s1, const* s2)
{
  while( *s1 == *s2 && *s1 != '\0'){
    s1++;
    s2++;
  }
  return *s1 - *s2;
}

strcpy

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

  • 把src的字符串拷贝到dst

    • restrict表明src和dst不重叠

  • 返回dst

    • 为了能链起代码来

复制一个字符串

char *dst = (char*)malloc(strlen(src)+1);
strcpy(dst,src);
char* mycpy(char* dst, const char* src)
{
  char* ret = dst;
  while( *dst++ = *src++ );
  *dst = '\0';
​
  return ret;
}

六.字符串搜索函数

1.字符串中找字符

1.char* strchr(const char* s,int c);// 字符串中寻找单个字符第一次出现的位置(从左边数过来) char* strrchr(const char* s,int c);// 字符串中寻找单个字符第一次出现的位置(从右边数过来) 返回NULL表示没有找到

2.char* strstr(const char *s1,const char *s2);// 寻找一个字符串 char* strcasestr(const char *s1,const char *s2);// 寻找字符串中忽略大小写

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘志达@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值