C语言 字符函数和字符串函数

C语言本本身没有字符串类型,但是在C语言中,对字符串的操作很频繁。在C语言中,字符串通常在字符数组中或常量字符串当中。下面。我们来介绍一些字符串常用的函数。

一,字符类

对于字符,经常遇到的是判断某个字符是不是小写,判断某个字符是不是大写,判断某个字符是不是数字,以及把小写字母转大写,大写字母转小写。

1,isdigit函数

isdigit函数是用来判断是不是十进制0~9,头文件是ctype.h。如果是,返回0。

#include<stdio.h>
#include<ctype.h>

int main(void)
{
	int a = 10;
	if (isdigit(a) == 0)
	{
		printf("是数字!");//将会打印结果。
	} 
	return 0;
}

2,islower函数 && isupper函数 && isalpha 函数 && isalnum 函数

islower函数是用来判断是不是小写字母a~z。头文件是ctype.h。如果是,返回非零的数。

isupper函数是用来判断是不是大写字母a~z。头文件是ctype.h。如果是,返回非零的数。

isalpha函数是用来判断是不是字母a~z,A~Z。头文件是ctype.h。如果是,返回非零的数。

isalnum函数是用来判断是不是字母和数字。头文件是ctype.h。如果是,返回非零的数。

#include<stdio.h>
#include<ctype.h>

int main(void)
{
	char a = 'e';
	if (islower(a))
	{
		printf("是小写字母!");//将会打印出结果
	}
	return 0;
}
#include<stdio.h>
#include<ctype.h>

int main(void)
{
	char a = 'E';
	if (isupper(a))
	{
		printf("是大写字母!");//将会打印出结果
	}
	return 0;
}
#include<stdio.h>
#include<ctype.h>

int main(void)
{
	char a = 'E';
	if (isalpha(a))
	{
		printf("是字母!");//将会打印出结果
	}
	return 0;
}
#include<stdio.h>
#include<ctype.h>

int main(void)
{
	char a = 'e';
	if (isalnum(a))
	{
		printf("是字母或数字!\n");//将会打印出结果
	}
	return 0;
}

3,tolower 函数 && toupper 函数

tolower函数是将大写字母转换成小写字母。头文件是ctype.h。

toupper函数是将小写字母转换成大写字母。头文件是ctype.h。

#include<stdio.h>
#include<ctype.h>

int main(void)
{
	char a = 'E';
	printf("%c\n", tolower(a));//e
	return 0;
}
#include<stdio.h>
#include<ctype.h>

int main(void)
{
	char a = 'e';
	printf("%c\n", toupper(a));//E
	return 0;
}

二、字符串类

字符串类函数头文件均为string.h。

1,strlen 函数

strlen函数用来求字符串的长度。

size_t strlen ( const char * str );

字符串是以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包含 '\0' )。 参数指向的字符串必须要以 '\0' 结束。 注意函数的返回值为size_t,是无符号的(易错)。

#include<stdio.h>
#include<string.h>

int main(void)
{
	char* a = "abcdef";
	printf("%d\n", strlen(a));//6
	return 0;

2,strcpy函数 && strncpy函数

strcpy函数用来进行字符串的拷贝。

strncpy函数和它的区别是该函数可以按照指定的长度进行拷贝。

char* strcpy(char * destination(目标字符串), const char * source(源字符串));

char * strncpy ( char * destination, const char * source, size_t num );

源字符串必须以 '\0' 结束。 这个函数会将源字符串中的 '\0' 拷贝到目标空间。 目标空间必须足够大,以确保能存放源字符串。 目标空间必须可变。 

int main(void)
{
	char a[] = "abcdef";
	char b[20] = { 0 };
	strcpy(b, a);
	printf("%s\n", b);//abcdef
	return 0;
}
int main(void)
{
	char a[] = "abcdef";
	char b[20] = { 0 };
	strncpy(b, a, 2);
	printf("%s\n", b);//ab
	return 0;
}

3,strcat函数 && strncat 函数

strcat函数用来进行字符串的连接。

strncat函数可以按照指定的连接。

char * strcat ( char * destination, const char * source );

char * strncat ( char * destination, const char * source, size_t num ); 

源字符串必须以 '\0' 结束。 这个函数会将源字符串中的 '\0' 拷贝到目标空间。 目标空间必须足够大,以确保能存放源字符串。 目标空间必须可变。 

#include<stdio.h>
#include<string.h>

int main(void)
{
	char a[] = "abcdef";
	char b[20] = { 'a', 'a', 'a'};
	strcat(b, a);
	printf("%s\n", b);//aaaabcdef
	return 0;
}
int main(void)
{
	char a[] = "abcdef";
	char b[20] = { 'a', 'a', 'a' };
	strncat(b, a, 2);
	printf("%s\n", b);//aaaab
	return 0;
}

4,strcmp 函数 && strncmp函数

strcmp函数用来进行字符串的比较。

strncmp函数是比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完。

int strcmp ( const char * str1, const char * str2 );

int strncmp ( const char * str1, const char * str2, size_t num);

标准规定:

        第一个字符串大于第二个字符串,则返回大于0的数字

        第一个字符串等于第二个字符串,则返回0 第一个字符串小于

        第二个字符串,则返回小于0的数字

这种比较不是比较字符串的长度,而是字符串的每一个字母的ASCII码值。

#include<stdio.h>
#include<string.h>

int main(void)
{
	char a[] = "abcdef";
	char b[20] = "bcdef";
	int ret = strcmp(a, b);
	printf("%d\n", ret);//-1
	return 0;
}

如果是比较长度,则返回的应该是大于0的数,结果是小于0的数,这就说明了这个函数不是比较字符串的长度的,而是ASCII码值。a的ASCII码值是97,b是98,所以结果是-1;

int main(void)
{
	char a[] = "abcdef";
	char b[] = "abcdef";
	int ret = strncmp(a, b, 2);
	printf("%d\n", ret);//0
	return 0;
}

5,strstr函数

strstr函数是用来判断主串中是否存在字串(字符串的匹配)。如果匹配成功,指向字符串中第一次出现位置的指针。如果是空的子串,返回这个主串,否则返回NULL。

char * strstr ( const char *str2, const char * str1);

int main(void)
{
	char a[] = "abcdef";
	char b[20] = "def";
	char* ret = strstr(a, b);
	printf("%s\n", ret);//def
	return 0;
}

6,strtok函数

strtok函数是按照某些分隔符进行字符串的分割。

char * strtok ( char * str, const char * sep );

        sep参数是个字符串,定义了用作分隔符的字符集合。第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。 strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注: strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)

        如果strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。 strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。 如果字符串中不存在更多的标记,则返回 NULL 指针。简单来说,比如:123@456#,第一次这个函数分割开123后,就保留了这个字符串的123后面的地址,同时,123置为空。下一次就是从NULL开始,在分割456后,在进行类似的操作,直到分割完,就返回NULL。

#include<stdio.h>
#include<string.h>

int main(void)
{
	char* a = "hello@world#.my&dream";
	char* str = NULL;
	char b[40] = { 0 };
	strcpy(b, a);/临时拷贝
	for (str = strtok(b, "@#."); str != NULL; str = strtok(NULL, "@#.&"))
	{
		printf("%s\n", str);//-1
	}
	
	return 0;
}

 7,strerror 函数(了解)

返回错误码,所对应的错误信息。头文件是 errno.h。

char * strerror ( int errnum );

 三、其他类型

以上的函数只对字符串有效。如果int等类型想要进行比如拷贝,连接的操作,有没有针对它们的函数呢?答案是有的。这些函数被称为内存函数。只要是在内存当中,就可以进行操作。下面我们介绍3个内存操作函数,分别用来进行拷贝,可以重叠的拷贝和比较。要注意的是,这些函数的参数中,num的单位是字节。

1,memcpy 函数

void * memcpy ( void * destination, const void * source, size_t num );

函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置,这个函数在遇到 '\0' 的时候并不会停下来。

int main(void)
{
	int a[10] = { 0 };
	int b[10] = { 1,2,3,4,5,6,7,8,9,0 };

	memcpy(a, b, 10 * sizeof(b[0]));
	for (int i = 0; i < 10; ++i)
	{
		printf("%d ", a[i]);//1 2 3 4 5 6 7 8 9 0
	}
	return 0;
}

2,memmove 函数

void * memmove ( void * destination, const void * source, size_t num );

和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。 如果源空间和目标空间出现重叠,就得使用memmove函数处理。

int main()
{
	char str[] = "memmove can be very useful......";
	memmove(str + 20, str + 15, 11);
	puts(str);//memmove can be very very useful.
	return 0;
}

3,memcmp 函数

int memcmp ( const void * ptr1, const void * ptr2, size_t num );

返回值和strcmp函数相同。

int main()
{
	int a[10] = { 1,2,3,4,5 };
	int b[10] = { 1,2,5,7,9 };
	int ret = memcmp(a, b, 2 * sizeof(a[0]));
	printf("%d\n", ret);//0
	return 0;
}

   

猜你喜欢

转载自blog.csdn.net/Naion/article/details/122624356