strlen函数,头文件
。函数用于求字符串长度并返回该值。 所求字符串长度应为不可改变的固定值。
#include
#include
int main ()
{
char szInput[256];
printf ("Enter a sentence: ");
gets (szInput);
printf ("The sentence entered is %u characters long.\n",(unsigned)strlen(szInput));
return 0;
}
Output:
Enter sentence: just testing The sentence entered is 12 characters
long
此函数为常用函数且较为简单,故小编在此提供三种模拟方法:
//方法一 计数方式
size_t my_strlen(const char * str)
{
int count = 0;
while(*str)
{
count++;
str++;
}
return count;
}
//方法二 不能创建临时变量,采用递归
size_t my_strlen(const char * str)
{
if(*str == '\0')
return 0;
else
return 1+my_strlen(str+1);
}
//方法三 指针——指针的方式
size_t my_strlen(const char *s)
{
char *p = s;
while(*p != ‘\0’ )
p++;
return p-s;
}
应注意函数参数和返回值保持与原函数一致。
strcpy函数,头文件
。函数用于将源字符串的内容复制到目标空间中。
源字符串必须以 ‘\0’ 结束。
会将源字符串中的 ‘\0’ 拷贝到目标空间。
目标空间必须足够大,以确保能存放源字符串。
目标空间必须可变。
#include
#include
int main ()
{
char str1[]="Sample string";
char str2[40];
char str3[40];
strcpy (str2,str1);//将str1的内容复制到str2内
strcpy (str3,"copy successful");//将字符串 copy successful 复制到str3内。
printf ("str1: %s\nstr2: %s\nstr3: %s\n",str1,str2,str3);
return 0;
}
Output:
str1: Sample string
str2: Sample string
str3: copy successful
要注意以下几点:
1.参数顺序
2.函数的功能,停止条件 ‘\0’
3.assert判断指针是否为空
4.const修饰指针
5.函数返回值
#include
#include
char* my_strcpy(char* n1,char*n2)
{
char* ret = n1;
assert((n1 && n2) != NULL);//防止指针为空
while ((*n1++ = *n2++))//运算顺序 '*' > '++' > '='
{
;
}
return ret;
}
int main()
{
char arr1[20] = "";
char arr2[] = "I love 阿迪";
my_strcpy(arr1, arr2);
printf("%s", arr1);
}
Output:
I love 阿迪
strcmp函数,头文件
,用于比较字符串/字符大小。(依次比较字符串中的字符大小,遇见不同的字符则直接结束比较并返回返回值。)
标准规定:
第一个字符串大于第二个字符串,则返回大于0的数字
第一个字符串等于第二个字符串,则返回0
第一个字符串小于第二个字符串,则返回小于0的数字
#include
#include
//猜测最喜欢的水果,直到输入apple才跳出循环并结束函数
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;
}
Output:
Guess my favourite fruit? orange
Guess my favourite fruit? banana
Guess my favourite fruit? apple
Correct answer!
#include
#include
int my_strcmp(const char* src, const char* dst)
{
int ret = 0;
assert((src&&dst) != NULL);
while (!(ret = *(unsigned char*)src - *(unsigned char*)dst) && *dst)
{
++src, ++dst;
}
if (ret < 0)
ret = -1;
else if (ret > 0)
ret = 1;
return(ret);
}
int main()
{
char arr1[] = "aschifsuf";
char arr2[] = "skdvgufsdgH";
int ret=my_strcmp(arr1, arr2);
printf("%d", ret);
}
Output:
–1
strcat函数,头文件
,用于追加字符串。
将源字符串的副本追加到目标字符串。目标中的终止空字符被源字符串的第一个字符覆盖,并且在目标中由两者串联形成的新字符串的末尾包含一个空字符。
注意:
源字符串必须以 ‘\0’ 结束。
目标空间必须有足够的大,能容纳下源字符串的内容。
目标空间必须可修改。
#include
#include
int main ()
{
char str[80];
strcpy (str,"these ");
strcat (str,"strings ");
strcat (str,"are ");
strcat (str,"concatenated.");
puts (str);
return 0;
}
Output:
these strings are concatenated.
#include
#include
char* my_strcat(char* des, const char* src)
{
char* ret = des;
assert((des && src) != NULL);
//找到目标空间中的 ‘\0’
while (*des)
{
des++;
}
while ((*des++ = *src++))
{
;
}
return ret;
}
int main()
{
char arr1[20] = "hey ";
char arr2[] = "我爱阿迪";
my_strcat(arr1, arr2);
printf("%s", arr1);
}
Output:
hey 我爱阿迪
strstr函数,头文件
。用于在字符串str1中查找str2的存在,若不存在则返回一个空指针NULL。
#include
#include
//在str数组中查找‘simple’字符串的存在,若存在则将其更改为‘sample’
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;
}
Output:
This is a sample string
#include
#include
char* my_strstr(const char* dest, const char* src)
{
assert((dest && src) != NULL);
char* be = (char*)dest;//存一份目标空间的起始地址
char* s1, * s2;
if (!*src)//如果src指向的内容为空,则直接返回(char*)dest。
return (char*)dest;
while (*be)/*当 *be的内容为空时(循环已经进行到str1的‘\0’处,仍未跳出循环),
则跳出循环返回NULL*/
{
s1 = be;
s2 = (char*)src;
while (*s1 && *s2 && !(*s1 - *s2)/*判断两个指针指向的内容是否相等*/)
{ //不相等且都不为空则进入循环进行++运算,比较下一地址上的内容
s1++;
s2++;
}
if (!*s2)/*如果上一循环循环结束后s2指向的内容为空(即在该be地址下
进行查找时s2可以查找完毕,即上一循环完整完成。)*/
return be;
be++;/*若在当下be地址开始查找时未能完成则对be进行++,进行以下一地址
为起始地址的查找*/
}
return NULL;
}
int main()
{
char arr1[] = "i love Iron man";
char arr2[] = "ron";
char* ret = my_strstr(arr1, arr2);
if (ret == NULL)
printf("找不到");
else
printf("找到了");
}
(注:感兴趣的小伙伴可以研究一下kmp算法。)