【C语言】字符函数与字符串函数介绍及使用

1. strlen

函数原型: size_t strlen(const char* str);

  • 计算字符串长度
  • 字符串以 ‘\0’ 作为结束标志,函数返回字符串中 ‘\0’ 前面出现的字符个数
  • size_t 是无符号的
#include <stdio.h>

int main()
{
	const char* str = "abcdef";
	printf("%d\n", strlen(str));
	return 0;
}

执行结果

6

 

2. strcpy

函数原型:char* strcpy(char* destination, const char* source);

  • 拷贝字符串
  • 字符串以 '\0’结束,会将源字符串中的 ‘\0’ 拷贝到目标空间
  • 目标空间足够大且可变
#include <stdio.h>
#include <string.h>

int main ()
{
  char str1[]="Sample string";
  char str2[40];
  char str3[40];
  strcpy (str2,str1);
  strcpy (str3,"copy successful");
  printf ("str1: %s\nstr2: %s\nstr3: %s\n",str1,str2,str3);
  return 0;
}

执行结果

str1: Sample string
str2: Sample string
str3: copy successful

 

strncpy

函数原型:char * strncpy ( char * destination, const char * source, size_t num );

拷贝num个字符从源字符串到目标空间。

如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个

int main()
{
	char str1[] = "To be or not to be";
	char str2[40];
	char str3[40];

	strncpy(str2, str1, sizeof(str2));

	strncpy(str3, str2, 5);
	str3[5] = '\0';   

	puts(str1);
	puts(str2);
	puts(str3);

	return 0;
}

执行结果

To be or not to be
To be or not to be
To be

 

3. strcat

  • 追加字符串
  • 源字符串必须 ‘\0’ 结束
  • 目标空间足够大,能容纳源字符串的内容
// 函数:char* strcat(char* destination, const char* source_);
#include <stdio.h>
#include <string.h>

int main ()
{
  char str[80];
  strcpy (str,"these ");
  strcat (str,"strings ");
  strcat (str,"are ");
  strcat (str,"concatenated.");
  puts (str);
  return 0;
}

these strings are concatenated.

strncat
函数原型:char * strncat ( char * destination, const char * source, size_t num );

将source的前num 个字符附加到destination,再加上一个终止空字符。

如果source 中C 字符串的长度小于num,则只复制终止空字符之前的内容。

int main()
{
	char str1[20];
	char str2[20];
	char str3[20];
	strcpy(str1, "To be ");
	strcpy(str3, "To be ");
	strcpy(str2, "or not to be");
	strncat(str1, str2, 6);
	strncat(str3, str2, 15);
	puts(str1);
	puts(str3);

	char str4[] = "To be ";
	strncat(str4, str2, 15);
	puts(str4);

	//char*p = "To be ";  // 报错
	//strncat(p, str2, 15);
	//puts(p);
	return 0;
}

To be or not
To be or not to be
To be or not to be

 

4. strcmp

函数原型: int strcmp(const char* str1, const char* str2)

  • 比较字符串
  • 第一个字符串大于第二个,返回大于0的数字
  • 第一个字符串等于第二个,返回0
  • 的第一个字符小于第二个字符串,返回小于0的数字
#include <stdio.h>
#include <string.h>

int main ()
{
  char key[] = "apple";
  char buffer[80];
  do {
     printf ("Guess my favorite fruit? ");
     fflush (stdout);
     scanf ("%79s",buffer);
  } while (strcmp (key,buffer) != 0);
  puts ("Correct answer!");
  return 0;
}

执行结果

Guess my favourite fruit? orange
Guess my favourite fruit? apple
Correct answer!

 

strncmp

函数原型:int strncmp ( const char * str1, const char * str2, size_t num );

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

int main()
{
	//const char* str[5] = { "R2D2", "C3PO", "R2A6"}; // 如果是字符数组会报错:无法从char转到const char*
	char str[][5] = { "R2D2", "C3PO", "R2A6" };
	int n;
	for (n = 0; n < 3; n++)
	if (strncmp(str[n], "R2xx", 2) == 0)  // strncmp第一个参数是const char *
	{
		printf("found %s\n", str[n]);
	}
	return 0;
}

 

5. strstr

函数原型: const char * strstr ( const char * str1, const char * str2 );
char * strstr ( char * str1, const char * str2 );

判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。

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

int main ()
{
  char str[] ="This is a simple string";
  char * pch;
  pch = strstr (str,"simple");
  if (pch != NULL)
    strncpy (pch,"sample",6);
  puts (str);
  return 0;
}

执行结果

This is a sample string

 

6. strtok

函数原型:char * strtok ( char * str, const char * delimiters );

  • 切割字符串
  • 参数str 指向欲分割的字符串,参数delim 则以什么分割(当发现参数delimiters该出字符被替换为 \0)。
  • 在第一次调用时,strtok()必需给予参数s 字符串,往后的调用则将参数s 设置成NULL。
  • 每次调用成功则返回下一个分割后的字符串指针。
#include <stdio.h>
#include <string.h>

int main ()
{
  char str[] ="- This, a sample string.";
  char * pch;
  printf ("Splitting string \"%s\" into tokens:\n",str);
  pch = strtok (str," ,.-");
  while (pch != NULL)
  {
    printf ("%s\n",pch);
    pch = strtok (NULL, " ,.-");
  }
  return 0;
}

 

7. strerror

函数原型: char * strerror(int errnum);

  • 返回的指针指向静态分配的字符串,程序不得修改该字符串
#include <stdio.h>
#include <string.h>
#include <errno.h>

int main ()
{
  FILE * pFile;
  pFile = fopen ("unexist.ent","r");
  if (pFile == NULL)
    printf ("Error opening file unexist.ent: %s\n",strerror(errno));
  return 0;
}

执行结果

打开文件不存在时出错:没有这样的文件或目录

 

8. 字符分类函数

C语言中头文件:#include <ctype.h>
C++中头文件:#include <locale> (vs2013测试,可以不用加也能运行成功)

函数符合下列条件就为真函数原型
isdigit十进制0-9int isdigit ( int c );
islower小写字母a-zint islower ( int c );
isupper大写字母A-Zint isupper ( int c );
isalpha字母a-z或A-Zint isalpha ( int c );

 

9. 字符转换函数

函数作用函数原型
tolower转换成小写字母int tolower ( int c );
toupper转换成大写字母int toupper ( int c );
putchar将字符写入标准输出int putchar ( int character );
atoi将字符数字转化为数字int atoi (const char * str);

 

10. memcpy

函数原型:void * memcpy ( void * destination, const void * source, size_t num );

头文件:#include <cstring>#include <string.h>

从source的位置开始向后拷贝num个字节的数据到destination(遇到 ‘\0’ 不会停下来)

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

#include <stdio.h>
#include <string.h>
int main()
{
	char *s = "Golden Global View";
	char d[20];
	memcpy(d, s, (strlen(s) + 1));
	printf("%s", d);
	return 0;
}

执行结果

Golden Global View

 

11、memset

函数原型:void * memset ( void * ptr, int value, size_t num );

给空间初始化:将已开辟内存空间 ptr 的首 num 个字节的值设为值 value(value是ASCII)

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

int main ()
{
  char str[] = "almost every programmer should know memset!";
  memset (str,'-',6);
  puts (str);
  return 0;
}

执行结果

------ every programmer should know memset!

 

12. memmove

函数原型:void * memmove ( void * destination, const void * source, size_t num );

memcpy和memmove的区别:memmove在copy两个有重叠区域的内存时可以保证copy的正确,而memcopy就不行,但memcopy比memmove的速度要快一些。如:
char s[] = “1234567890”;
char* p1 = s;
char* p2 = s+2;
memcpy(p2, p1, 5)与memmove(p2, p1, 5)的结果就可能是不同的,memmove()可以将p1的头5个字符 “12345” 正确拷贝至p2,而memcpy()的结果就不一定正确。

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

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

执行结果

memmove can be very very useful.

 

13. memcmp

函数原型: void * memcpy ( void * destination, const void * source, size_t num );

memcmp与strcmp的区别:该函数在找到空字符后不会停止比较。

  • 返回值
返回值表示
< 0两个内存块中不匹配,第一个字节在ptr1中的值比在ptr2中的值低
= 0两个内存块的内容相等
> 0两个内存块中不匹配,第一个字节在ptr1中的值大于在ptr2中的值
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值