学无先后,达者为师

网站首页 编程语言 正文

字符数组,字符串及其操作函数,指针

作者:簏屿 更新时间: 2022-07-19 编程语言

一、字符数组 与 字符串

char a[10] = {'a','b','c',...};
字符串:多个字符串在一起,用""括起来,以'\0'作为结束标志
 
1、一维数组
    char a[10] = {"hello\0"};
		puts(a);
		gets(a);
2、二维数组
    char a[3][10] = {"hello","world","China"};
		puts(a[0]);
		puts(a[1]);
		puts(a[2]);
		puts(&a[0][3]); -- 打印出"lo"
            
对于字符串,定义的时候如果没有初始化(0),在后面赋值的时候一定要加上'\0',否则会出现乱码
                 
  如何去打印一维数组的字符串
       1puts(a);
	   2printf("%s",a);
  如何去打印二维数组的字符串
       for(i = 0; i < 3; i++)
           1puts(a[i]);
		   2printf("%s",a[i]);

二、字符串操作函数

1、strlen

头文件
#include <string.h>
格式
	size_t strlen(const char *s);
功能
	计算给定的字符串长度,不包括'\0'
参数
	s -- 表示要求长度的字符串
返回值
    给定字符串的长度,不包括'\0'
    
strlen 和 sizeof区别
    (1)sizeof是一个关键字,strlen()是一个函数
    (2)sizeof会计算'\0'
    (3)sizeof()不能返回动态分配的内存空间大小
    
strnlen
    size_t strnlen(const char *s, size_t maxlen);
	功能:字符串实际个数 <= maxlen  返回字符串实际个数
                     > maxlen  返回maxlen

2、strcat

头文件
	#include <string.h>
格式
	char *strcat(char *dest, const char *src);
功能
	将字符串src追加到dest的末尾
参数
    dest -- 目标字符串
	src -- 源字符串
返回值
    返回追加之后的新的字符串dest的首地址

char *strncat(char *dest, const char *src, size_t n);
	n -- 追加的最大字符数量

3、strcpy – 覆盖

头文件
	#include <string.h>
格式
	char *strcpy(char *dest, const char *src);
功能
	将字符串src的内容拷贝到首地址为dest的空间
参数
    dest -- 目标字符串
	src -- 要复制的字符串
返回值
    返回拷贝之后的新的字符串dest的首地址   

    char *strncpy(char *dest, const char *src, size_t n);
		n -- 指定多少个字符复制过去

4、strcmp

头文件
	#include <string.h>
格式
	int strcmp(const char *s1, const char *s2);
功能
	比较两个字符串大小,比较ASCII码,对位比较
参数
    要比较的两个字符串
返回值
    s1 > s2 返回大于0的数
    s1 = s2 0
    s1 < s2 返回小于0的数
    
   int strncmp(const char *s1, const char *s2, size_t n);
		n -- 指定比较的字符个数

5、strstr

头文件
	#include <string.h>
格式
	char *strstr(const char *haystack, const char *needle);

功能
	检索子串在字符串首次出现的位置
参数
    haystack -- 被检索的字符串
    needle -- 要检索的子串
返回值
    返回needle首次出现的位置,如果没有返回NULL

三、指针(地址) – 指针是一个变量

1、指针:<存储类型><数据类型> * <指针变量名>;
	数据类型:<数据类型> + *  --- 构成了一个新的数据类型
        代表:指针所指向的数据的数据类型
    初始化:
		int a = 10;
		int *p = &a;//int *p;
					  p = &a;
	指针变量:实际上也是一个普通变量,特殊在于里面存放的地址
        (也有自己的内存空间)
        如果指针变量没有赋值,它里面存储的是随机地址
        
2、指针的运算符 -- &(取地址) *(取内容)
    int a = 10;
	int *p;
	p = &a;
	*p = *(&a); ==> *p = a;
	&* 是互为逆运算
	
除了数组名以外,64位操作系统所有的地址用sizeof求大小得到的都是8个字节,32位是4个字节

3、指针的运算 -- 通过 间接访问 的形式,去操作原来的变量
    int i = 10;
	int *p = &i;
	
	i = 5; //直接访问:直接操作i
	*p = 5;//间接访问:通过i的地址去操作i

	int j = *p*10; --> j = i * 10;

4、指针变量的运算 -- 地址的偏移(一般用于数组)
    非单独使用:
   	p++:先使用p中存放的地址,再向高地址位偏移一个数据类型单位
    ++p:先向高地址位偏移一个数据类型单位,再使用p中存放的地址
    p+N:向高地址位偏移N个数据类型单位
    p-N:向低地址位偏移N个数据类型单位
    p-q:指针变量 - 指针变量 = 中间相差了多少个数据类型单位
    
5、特殊指针
    (1)野指针:没有初始化 且 没有赋值的指针
        可能会报段错误
        段错误:非法访问内存
        int *p;
		printf("%d\n",*p);
    (2)空指针:指向零地址空间的指针
        一定会报段错误
        int *p = NULL;
		printf("%d\n",*p);
    (3)空类型指针(void *) -- 可以存放任何类型的地址
        注意:在使用的时候,一定要进行强转

原文链接:https://blog.csdn.net/qq_64076967/article/details/125835786

栏目分类
最近更新