galoisgodel 2019-04-28
在C语言中有很多的字符操作函数,而我们经常用到的字符操作函数有strcpy ,strncpy ,strcat ,strcmp ,strlen ,strlwr ,strupr ,gets ,puts ,等等很多很多。
下面我们来解析一下这些字符操作函数。
1.strcpy(字符数组)
这个函数的作用是字符串的拷贝,在c语言的函数栈帧中有一块静态区存放着常量,常量是不能被修改的,因此,在实现strcpy函数时所定义的拷贝的目标必须是字符数组,这样才能进行拷贝,否则系统会报错出来目标字符串不能够被修改。在strcpy函数的定义是这样的 char *strcpy( char *strDestination, const char *strSource ); 将目标字符串放在第一个参数的位置,源字符串放在第二个参数的位置。在字符串的拷贝中,是拷贝所有的字符,包括 “\0”,所以在打印时只会打印出源字符串的所有字符,不会打印目标字符串的字符。而且在拷贝时,必须保证目标字符串有足够的空间来盛放源字符串,防止空间不够后将目标字符串的 “\0”取代,使 printf 函数再打印时出错。
int main()
{
char arr1[] = "hello";
char arr2[]= "word";
strcpy(arr1, arr2);
printf("%s\n",arr1);
system("pause");
return 0;
}
2.strncpy(字符数组)
这个函数和strcpy函数一样也是实现字符串的拷贝,只不过在进行字符串的拷贝时可以进行人工的选择,选择拷贝几个字符倒目标字符串中去,并且会在拷贝完最后一个字符时加一个 “\0” 在索要拷贝的字符串后,打印时也只能打印出来所要拷贝的字符串。
int main()
{
char arr1[] = "ased";
char arr2[] = "qw";
strncpy(arr1, arr2, 4);
printf("%s\n", arr1);
system("pause");
return 0;
}
3.strcat(字符数组)
这个函数是实现字符串的追加,即是在目标字符串的后面加一个源字符串,实现字符串的追加。在追加字符串时要保证目标字符串可以被修改,同时目标字符串有足够多的空间来接收源字符串的内容。在字符串的追加过程中,会将目标字符串的 “\0” 覆盖掉,然后将源字符串的 “\0” 追加在最后面。
int main()
{
char arr1[20] = "hello ";
char arr2[] = "word";
strcat(arr1, arr2);
printf("%s\n", arr1);
system("pause");
return 0;
}
4.strcmp(字符数组或常量字符串)
这个函数的作用是比较两个字符串的大小,在这个函数中,比较的可以是字符串和字符数组,因为不会改变常量,所以两种都可以。这个函数在比较时,是从第一个字符开始,逐个字符的进行比较,如果遇见第一个两个字符串不同的字符,就进行ASC II 比较如果第一个大于第二个,返回大于零的数,反之返回小于零的数,如果相等,就返回0。这个举例是模拟实现strcmp,希望可以加深理解。
#include<stdio.h>
#include<assert.h>
int my_strcmp(const char *arr1,const char *arr2)
{
assert(arr1 != NULL);
assert(arr2 != NULL);
while (*arr1 == *arr2)
{
arr1++;
arr2++;
}
while (*arr1 != *arr2)
{
return (*arr1 - *arr2);
}
}
int main()
{
char arr1[] = "hello";
char arr2[] = "word";
printf("%d\n", my_strcmp(arr1, arr2));
if (my_strcmp(arr1, arr2) < 0)
{
printf("arr1小于arr2\n");
}
else if (my_strcmp(arr1, arr2) == 0)
{
printf("arr1n等于arr2\n");
}
else
{
printf("arr1n大于arr2\n");
}
system("pause");
return 0;
}
5.strlen(字符数组或常量字符串)
这个函数的作用是求取字符串的长度,对象可以是字符数组或字符串。在求取字符串的长度时,这个函数当遇到第一个 “\0” 时停止,这个 “\0” 不计算在所求取的长度中。注意在该函数传参时,所传的是指针所指行的地址,通过地址来访问字符串,求取长度。
#include<stdio.h>
int main()
{
char *arr = "hello word";
int sz = 0;
sz = strlen(arr);
printf("%d\n", sz);
system("pause");
return 0;
}
6.strlwr(字符数组)
这个函数的作用是将一个字符串中的大写字符转换成小写字符。这个函数的内涵是通过指针的传递获得字符后,进行比较字符的ASC II 是否处于大写字符中,如果是大写字符的话就给源字符加 32,便得到小写字符。这个函数只适用于字符数组,而不适用于常量字符串。注意这个函数的定义是 char *_strlwr( char *string ) ,所以在使用这个函数时用的是 _strlwr 。
#include<stdio.h>
int main()
{
char arr[] = "HELLO WORD";
_strlwr(arr);
printf("%s\n", arr);
system("pause");
return 0;
}
7.strupr(字符数组)
这个函数的作用是将一个字符串的小写字母小写字母转化成大写字符。其中要注意的点与strlwr相同,所以就不再多提。注意,这个函数的定义是char *_strupr( char *string );所以在使用这个函数时用的是_strupr.
#include<stdio.h>
int main()
{
char arr[] = "hello word";
_strupr(arr);
printf("%s\n", arr);
system("pause");
return 0;
}
8 .gets(字符数组)和 puts(字符数组或常量字符串)
这两个函数的作用分别是获得字符串和输出字符串。
gets函数是从终端获得字符串,作用与scanf函数相同,但只能获得字符。应注意的是,在将获得的字符串存储时必须将字符串存进字符数组中,理由还是因为常量是不能被改变的。puts函数只能输出字符串,将所要输出的字符串打印在屏幕上。
#include<stdio.h>
int main()
{
char arr1[10] = { 0 };
gets(arr1);
puts(arr1);
system("pause");
return 0;
}