字符串函数

strcat 链接两个字符串

  • 不能自己连自己,因为strcat本质是在前一个字符串\0的位置上直接加后面字符串的字符但是当自己加自己时导致后面字符串不能找到结束符\0所以会无限的加下去

  • 会把拷贝元的 \0 追加到目标空间里

  • 目标空间必须够大 必须有 \0 因为是以 \0 为目标作为链接的开始位置

  • 拷贝元 必须有 \0 因为是以 \0为结束标志

  • 返回值类型为 char * 返回的是目的字符串的起始位置

#include<stdio.h>
#include<string.h>
int main() {
	char arr1[20] = "asdf";
	char arr2[] = "qwe";
	strcat(arr1, arr2);
	printf("%s",arr1);
	return 0;
}

strncat 链接指定长度的字符串(拷贝元字符串的长度)

  • 不管要链接多长的字符串 strncat 会主动在目标地址最后面追加一个 \0

  • 如果长度大于拷贝元的长度则只会在拷贝元后追加一个 \0

  • 其他性质于strcat相同

#include<stdio.h>
#include<string.h>
int main() {
	char arr1[30] = "www";
	char arr2[] = "wew";
	strncat(arr1,arr2,2);
	printf("%s",arr1);
	return 0;
}

strcpy 字符串拷贝

  • 字符串之间进行赋值不能用 str1 = str2 的方式 这样其实是将str2的地址给str1就是str1指向了str2指向的地址

  • strcpy会把结束符\0拷贝过去

  • 返回值是char* 类型 返回目的空间的起始地址

  • 拷贝元必须有 \0 因为拷贝过程是以 \0 作为结束符的

  • 目标空间必须足够大以确保拷贝过去的元素装不下导致越界访问

  • 目标空间必须可变 (比如目标字符串是 char * arr = "asda"; 这时arr是常量不能被改变)

#include<stdio.h>
#include<string.h>
int main() {
	char arr1[] = "abcdef";
	char arr2[] = "dfg";
	strcpy(arr1,arr2);
	printf("%s",arr1);
	return 0;
}

strncpy 拷贝指定长度的字符串 拷贝元字符串的长度

  • 是否拷贝了 \0 取决于拷贝的长度 和拷贝元是否有 \0

  • 如果长度大于拷贝元的长度多出来的位置会补上 \0

  • 其它性质和strcpy相同

#include<stdio.h>
#include<string.h>
int main() {
	char arr1[10] = "qweuuu";
	char arr2[] = "345";
	strncpy(arr1,arr2,sizeof(arr2)+1);
	printf("%s",arr1);
	return 0;
}

strcmp 字符串比较

  • 返回值为 int 类型 参数1大于参数2返回值大于0, 参数1小于参数2返回值小于0, 参数1等于参数2返回值等于0 (两个字符串比的是首字符的ASCII码 若果首字符相等依次往后比)VS编译器返回的是 1 0 -1

#include<stdio.h>
#include<string.h>
int main() {
	char* p1 = "asd";
	char* p2 = "asd";
	int ret = strcmp(p1, p2);
	printf("%d",ret);
	return 0;
}

strncmp 比较指定长度字符串

  • 其他性质与strcmp相同

#include<stdio.h>
#include<string.h>
int main() {
	const char* p1 = "12367";
	const char* p2 = "12345";
	int ret = strncmp(p1,p2,3);
	printf("%d",ret);
	return 0;
}

strlen 求字符串长度

  • 用strlen求字符串长度时字符串里面必须有\0,因为他是以其为寻找结束标志

    例char arr[]={'d','f','g'}strlen方法不能求arr的长度

  • 返回值类型为size_t(unsigned int)

    所以不能用strlen("qwe") - strlen("qewdcs") 作为 if 的判断条件 因为无符号数相减的到是负数的话 计算机存的是补码无符号数计算机不会认为它是负数会认为其是一个很大的正数

#include<stdio.h>
#include<string.h>
int main() {
	int len = strlen("qwer");
	printf("%d",len);
	return 0;
}

strstr 找子串

  • 返回值是 char* 如果找到了返回找到的第一个字节的地址 没找到返回空指针(NULL)

  • 返回值是查找元在查找空间第一次出现的地址

//判断字符串1是不是从字符串2中截取出来的
#include<stdio.h>
#include<string.h>

int is_left_move(char* str1,char* str2 ) {
	
	strncat(str1, str1,strlen(str1));
	char* p = strstr(str1,str2);
	if (p == NULL) {
		return 0;
	}
	else
	{
		return 1;
	}
}
int main() {
	char arr1[30] = "abcdef";
	char arr2[] = "cdefab";
	int ret = is_left_move(arr1,arr2);
	if (ret == 1) {
		printf("yes \n");
	}
	else
	{
		printf("no \n");
	}
	
	return 0;
}

strtok 截段

  • 参数2是用作分割符的集合

  • 参数1里面有可能有一个或多个参数2里面元素分割的字符串

  • strtok函数找到参数2中元素在参数1中的位置 并用 \0 分割参数1(这时删去了分割字符)返回起始位置的指针

  • strtok会改变原字符串所所以利用时最好拷贝来用

  • strtok第一个参数不为NULL时,函数将找到它的第一个标记,函数将保存他在字符串中的位置

  • strtok第一个参数为NULL时,函数将在同一个字符串中被保存的位置开始,查找下一个标记

  • 如果字符串中不存在标记函数返回NULL

#include<stdio.h>
#include<string.h>
int main() {
	char str[] = "222@656@qq.com";
	char *sep= "@.";
	char buf[1024] = "";

	strcpy(buf,str);

	//char* p =strtok(buf, sep);
	//printf("%s \n",p);

	//p = strtok(NULL,sep);
	//printf("%s \n", p);

	//p = strtok(NULL, sep);
	//printf("%s \n", p);

	//p = strtok(NULL, sep);
	//printf("%s", p);

	char* p = NULL;

	for (p = strtok(buf, sep); p != NULL; p = strtok(NULL, sep))
	{
		printf("%s\n", p);
	}
	return 0;
}

strerror 错误信息函数

  • 返回错误码所对应的错误信息

#include<stdio.h>
#include<string.h>
#include<errno.h>
int main() {
	char* str1 = strerror(8);      //会返回数值(库函数返回值)对应的错误信息
	char* str2 = strerror(errno);  //errno是一个全局错误码变量当库函数执行发生错误就会把对应的错误码赋值给errno
	printf("%s",str1);        
	printf("%s",str2);        
	return 0;
}

上一篇:对数器的概念与使用


下一篇:【534】ndarray 提取行列进行任意变换 & 相关 ndarray 操作