文章目录
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-9 | int isdigit ( int c ); |
islower | 小写字母a-z | int islower ( int c ); |
isupper | 大写字母A-Z | int isupper ( int c ); |
isalpha | 字母a-z或A-Z | int 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中的值 |