C语言基础:011 C进阶语法 - 字符函数和字符串函数

发布时间:2023-12-19 09:30

C语言是没有字符串类型的

1、字符串通常放在常量字符串 中或者 字符数组 中。
2、字符串常量 适用于那些对它不做修改的字符串函数

1、字符函数

strlen:求字符串长度

  1. 函数声明:size_t strlen ( const char * str );
  2. (1)字符串已经 ‘\0’ 作为结束标志,strlen 函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包含 ‘\0’ )。
    (2)参数指向的字符串必须要以 ‘\0’ 结束。
    (3)注意函数的返回值为size_t,是无符号的
  3. code示例
#include 
int main()
{
	const char* str1 = "abcdef";
	const char* str2 = "bbb";
	printf("%d %d\n", strlen(str1), strlen(str2)); // 6 3
	return 0;
}

1.1、长度受限制的字符串函数

strcpy:copy字符串

  1. 函数声明:char* strcpy(char * destination, const char * source );
  2. (1)源字符串必须以 ‘\0’ 结束。
    (2)会将源字符串中的 ‘\0’ 拷贝到目标空间。
    (3)目标空间必须足够大,以确保能存放源字符串。
    (4)目标空间必须可变。
    (5) 如果目标字符串非空,则将目标字符清空账号后,在做copy操作
  3. code示例
#include 
#include 
int main()
{
	char str1[20];
	strcpy(str1, "To be");
	puts(str1);   // To be
	strcpy(str1, "abcdefgh");
	puts(str1);   // abcdefgh
	return 0;
}

strcat:末尾追加字符串

  1. 函数声明:char * strcat ( char * destination, const char * source );
  2. (1)将源字符串的副本附加到目标字符串。
    (2)目标中的终止空字符被源的第一个字符覆盖,并且在目标中由两者连接形成的新字符串的末尾包含一个空字符。
    (3)源字符串必须以 ‘\0’ 结束。
    (4)目标空间必须有足够的大,能容纳下源字符串的内容。
    (5)目标空间必须可修改。
    (6)附加的字符串的指针与源字符串指向同一片内存空间
  3. code示例

strcmp:比较字符串是否相同

  1. 函数声明:int strcmp ( const char * str1, const char * str2 );
  2. (1)此函数开始比较每个字符串的第一个字符。
    (2)如果它们彼此相等,则继续以下对,直到字符不同或到达终止空字符。
    (3)标准规定:
    第一个字符串大于第二个字符串,则返回大于0的数字
    第一个字符串等于第二个字符串,则返回0
    第一个字符串小于第二个字符串,则返回小于0的数字
  3. code示例

1.2、长度受限制的字符串函数

strncpy:拷贝前n个字符到目标字符串

  1. 函数声明:char * strncpy ( char * destination, const char * source, size_t num );
  2. (1)拷贝num个字符从源字符串到目标空间。
    (2)如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。
  3. code示例

strncat:追加前n个字符到目标字符串的尾部

  1. 函数声明:char * strncat ( char * destination, const char * source, size_t num );
  2. (1)将源的前 num 个字符附加到目标,加上一个终止空字符。
    (2)如果 source 中 C 字符串的长度小于 num,则只复制直到终止空字符的内容
  3. code示例
#include 
#include 
int main()
{
	char str1[20];
	char str2[20];
	strcpy(str1, "To be ");
	strcpy(str2, "or not to be");
	strncat(str1, str2, 6);      // 追加6个字符到尾部
	puts(str1);  // To be or not
	puts(str2);  // or not to be
	return 0;
}

strncmp:比较前n个字符

  1. 函数声明:int strncmp ( const char * str1, const char * str2, size_t num );
  2. (1)比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完。
    (2)标准规定:
    第一个字符串大于第二个字符串,则返回大于0的数字
    第一个字符串等于第二个字符串,则返回0
    第一个字符串小于第二个字符串,则返回小于0的数字
  3. code示例
#include 
#include 
int main()
{
	char str[][5] = { "R2D2" , "C3PO" , "R2A6" };
	int n;
	puts("Looking for R2 astromech droids...");
	for (n = 0; n < 3; n++)
	{
		if (strncmp(str[n], "R2xx", 2) == 0) // 比较前两个字符
		{
			printf("found %s\n", str[n]);
		}
	}
	/*
	R2D2
	R2A6
	*/
	return 0;
}

1.3、字符串查找

strstr:返回子串出现的指针

  1. 函数声明:char * strstr ( const char *str1, const char * str2);
  2. (1) 返回指向 str1 中第一次出现 str2 的指针,如果 str2 不是 str1 的一部分,则返回空指针。
  3. code示例
#include 
#include 
int main()
{
	char str[] = "This is a simple string";
	char* pch;
	pch = strstr(str, "simple");
	puts(str);                  // This is a simple string
	puts(pch);                  // simple string
	strncpy(pch, "sample", 6); //拼接的字符串指向同一片内存空间
	puts(str);                  // This is a sample string
	puts(pch);                  // sample string
	return 0;
}

strtok:字符串分割

  1. 函数声明:char * strtok ( char * str, const char * sep );
    2. (1)sep参数是个字符串,定义了用作分隔符的字符集合
    (2)第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记
    (3)strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)
    (4)strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
    (5)strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
    (6)如果字符串中不存在更多的标记,则返回 NULL 指针。
  2. code示例
#include 
#include 
int main()
{
	char str[] = "- This, a sample string.";
	char* pch;
	printf("%s\n", str);
	pch = strtok(str, " ,.-");
	while (pch != NULL)
	{
		printf("%s\n", pch);
		pch = strtok(NULL, " ,.-");
	}
	/*
	This
	a
	sample
	string
	*/
	return 0;
}

1.4、错误信息报告

strerror:返回错误码,所对应的错误信息

  1. 函数声明:char * strerror ( int errnum );
  2. (1) 返回错误码,所对应的错误信息
  3. code示例
#include 
#include 
#include //必须包含的头文件
int main()
{
	FILE* pFile;
	pFile = fopen("unexist.ent", "r");
	if (pFile == NULL)
		printf("Error opening file unexist.ent: %s\n", strerror(errno));
	// Error opening file unexist.ent: No such file or directory
	return 0;
}

1.5、字符操作

函数 如果他的参数符合下列条件就返回真
iscntrl 任何控制字符
isspace 空白字符:空格‘ ’,换页‘\f’,换行’\n’,回车‘\r’,制表符’\t’或者垂直制表符’\v’
isdigit 十进制数字 0~9
isxdigit 十六进制数字,包括所有十进制数字,小写字母af,大写字母AF
islower 小写字母a~z
isupper 大写字母A~Z
isalpha 字母a~z 或 A~Z
isalnum 字母或者数字,az,AZ,0~9
ispunct 标点符号,任何不属于数字或者字母的图形字符(可打印)
isgraph 任何图形字符
isprint 任何可打印字符,包括图形字符和空白字符

1.6、内存操作函数

memcpy:

  1. 函数声明:void * memcpy ( void * destination, const void * source, size_t num );
  2. (1)函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
    (2)这个函数在遇到 ‘\0’ 的时候并不会停下来。
    (3)如果source和destination有任何的重叠,复制的结果都是未定义的。
  3. code示例
#include 
#include 

struct {
	char name[40];
	int age;
} person, person_copy;

int main()
{
	char myname[] = "Pierre de Fermat";
	memcpy(person.name, myname, strlen(myname) + 1);
	person.age = 46;

	memcpy(&person_copy, &person, sizeof(person));
	printf("person_copy: %s, %d \n", person_copy.name, person_copy.age);  // person_copy: Pierre de Fermat, 46
	return 0;
}

memmove:

  1. 函数声明:void * memmove ( void * destination, const void * source, size_t num );
  2. (1)和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
    (2)如果源空间和目标空间出现重叠,就得使用memmove函数处理。
  3. code示例
#include 
#include 
int main()
{
	char str[] = "memmove can be very useful......";
	memmove(str + 20, str + 15, 11);
	puts(str);  // memmove can be very useful.
	return 0;
}

memset:

  1. 函数声明:
  2. 2
  3. code示例

memcmp:

  1. 函数声明:int memcmp ( const void * ptr1, const void * ptr2, size_t num );
  2. (1)比较从ptr1和ptr2指针开始的num个字节
    (2)标准规定:
    第一个字符串大于第二个字符串,则返回大于0的数字
    第一个字符串等于第二个字符串,则返回0
    第一个字符串小于第二个字符串,则返回小于0的数字
  3. code示例
#include 
#include 
int main()
{
	char buffer1[] = "DWgaOtP12df0";
	char buffer2[] = "DWGAOTP12DF0";
	int n;
	n = memcmp(buffer1, buffer2, sizeof(buffer1));
	if (n > 0) printf("'%s' is greater than '%s'.\n", buffer1, buffer2);  //  'DWgaOtP12df0' is greater than 'DWGAOTP12DF0'.
	else if (n < 0) printf("'%s' is less than '%s'.\n", buffer1, buffer2);
	else printf("'%s' is the same as '%s'.\n", buffer1, buffer2);
	return 0;
}

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号