1.字符串函数
字符串函数的头文件是string.h
1.1strcpy函数
这个函数的作用的是字符串的拷贝,将源指向的字符串复制到目标指向的数组中。
该函数的参数及返回值:
代码示例:
#include <stdio.h>
#include <string.h>
int main ()
{
char str1[]="Sample string";
char str2[40];
char str3[40];
strcpy (str2,str1);//把str1中的内容复制到str2中
strcpy (str3,"copy successful");
printf ("str1: %s\n str2: %s\n str3: %s\n",str1,str2,str3);
return 0;
}
运行结果:
- 源字符串必须以‘\0’结束。
- 该函数会将源字符串中的‘\0’拷贝到目标空间中
- 目标空间必须足够大,保证能存放源字符串。并且目标空间必须可以修改。
1.2strcat
该函数的功能是连接字符串,将源字符串附加到目标字符串。(目的地和来源不应重叠)
代码示例:
int main ()
{
char str[80];
strcpy (str,"these ");
strcat (str,"strings ");
strcat (str,"are ");
strcat (str,"concatenated.");
puts (str);
return 0;
}
运行结果:
- 源字符串必须以'\0'结束
- 目标字符串中也要有‘\0’,否则无法知晓从哪里开始追加
- 目标空间必须足够大,并且目标空间可以修改
1.3strcmp
该函数的作用是比较两个字符串的大小,比较的是两个字符串中对应位置的ASCII码值的大小。
该函数的返回值如图:
代码示例:
int main()
{
char arr1[] = "abcdef";
char arr2[] = "abd";
int ret = strcmp(arr1, arr2);
if (ret > 0)
{
printf("arr1>arr2\n");
}
else if (ret < 0)
{
printf("arr1<arr2\n");
}
else
{
printf("arr1=arr2\n");
}
return 0;
}
运行结果:
1.4strncpy
该函数与strcpy类似,都是用来对字符串的拷贝,不同的是该函数多了一个参数,用来说明从源字符串中复制的最大字符数。(目的地和来源不应重叠)
代码示例:
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;
}
运行结果:
- 若源字符串的长度小于num个,则拷贝完源字符串后,在目标空间的后面补‘\0’,直到num个
1.5strncat
该函数与strcat相似,用来连接字符串,多的参数用来说明要追加的最大字符数。
代码:
int main ()
{
char str1[20];
char str2[20];
strcpy (str1,"To be ");
strcpy (str2,"or not to be");
strncat (str1, str2, 6);
puts (str1);
return 0;
}
运行结果:
- 将源的前num个字符追加到目标,再加上一个终止的‘\0’字符。
- 如果source中的C字符串的长度小于num,则只复制终止‘\0’字符之前的内容。
1.6strncmp
用来比较str1和str2前num个字符,如果相等就继续往后面比较,最多比较num个字母,如果提前发现不一样就提前结束。
返回值和strcmp相同。
代码:
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]);
}
}
return 0;
}
运行结果:
2.内存函数
2.1memcpy
该函数是用来复制内存块的,将num字节的值从源指向的位置直接复制到目标指向的内存块。(源和目标空间的内存块空间不能重叠,如果有任何重叠,则复制的结果都是为定义的)
其中num的单位是字节。
代码:
int main()
{
int arr1[] = { 0,1,2,3,4,5,6,7,8,9 };
int arr2[10] = { 0 };
memcpy(arr2, arr1, sizeof(int) * 10);
for (int i = 0; i < 10; i++)
{
printf("%d ", arr2[i]);
}
return 0;
}
运行结果:
2.2memmove
memmove和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
代码:
int main()
{
int arr1[20] = { 0,1,2,3,4,5,6,7,9 };
memmove(arr1 + 5, arr1, sizeof(int) * 3);
for (int i = 0; i < 20; i++)
{
printf("%d ", arr1[i]);
}
return 0;
}
运行结果:
2.3memset
memset是用来设置内存的,将内存块的前num个字节设置为想要的内容。
其中value是要设置的值。
代码:
int main()
{
char str[] = "almost every programmer should know memset!";
memset(str, '-', 6);
puts(str);
return 0;
}
运行结果:
2.4memcmp
该函数的作用是比较从ptr1和ptr2指针指向的位置开始,向后num个字节内容的大小。
返回值:
代码:
int main()
{
char buffer1[] = "DWgaOtP12df0";
char buffer2[] = "DWGAOTP12DF0";
int n = memcmp(buffer1, buffer2, sizeof(buffer1));
if (n > 0)
{
printf("'%s' is greater than '%s'.\n", buffer1, buffer2);
}
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;
}
运行结果: