C语言常用的字符函数、字符串函数、内存函数

引言

        在日常刷题时或者编程时,通常要对字符、字符串或者内存进行操作或者管理。为了⽅便操作字符和字符串,C语⾔标准库中提供了 ⼀系列库函数,接下来我们就学习⼀下这些函数。

字符函数

        字符分类函数

        C语⾔中有⼀系列的函数是专⻔做字符分类的,也就是⼀个字符是属于什么类型的字符的。 这些函数的使⽤都需要包含⼀个头⽂件是 ctype.h

        下面我们讲一些常用的字符函数

int islower ( int c );

        islower 是能够判断参数部分的 c 是否是小写字母的。 通过返回值来说明是否是⼩写字⺟,如果是⼩写字⺟就返回⾮0的整数,如果不是⼩写字⺟,则返回 0。

例如:编写一个程序,将字符串中的小写字母转换为大写字母,其他字符不变

#include <stdio.h>
#include <ctype.h>
int main ()
{
 int i = 0;
 char str[] = "Test String.\n";
 char c;
 while (str[i])
 {
     c = str[i];
     if (islower(c)) 
         c -= 32;
     putchar(c);
     i++;
 }
 return 0;
}
        字符转换函数

        C语⾔提供了2个字符转换函数:

int tolower ( int c ); //将参数传进去的⼤写字⺟转⼩写 
int toupper ( int c ); //将参数传进去的⼩写字⺟转⼤写

示例:

#include <stdio.h>
#include <ctype.h>
int main ()
{
 int i = 0;
 char str[] = "Test String.\n";
 char c;
 while (str[i])
 {
     c = str[i];
     if (islower(c)) 
         c = toupper(c);
     putchar(c);
     i++;
 }
 return 0;
}

字符串函数

        要使用字符串函数,需要include了一个string.h的头文件

        strlen函数的使用和模拟实现
size_t strlen ( const char * str );

            使用:

#include <stdio.h>
#include <string.h>
int main()
{
 const char* str1 = "abcdef";
 const char* str2 = "bbb";
 if(strlen(str2)-strlen(str1)>0)
 {
     printf("str2>str1\n");
 } 
 else
 {
     printf("srt1>str2\n");
 }
 return 0;
}

        模拟实现:

                方式一:

//计数器⽅式
int my_strlen(const char * str)
{
 int count = 0;
 assert(str);
 while(*str)
 {
     count++;
     str++;
 }
 return count;
}

                方式二:

//不能创建临时变量计数器
int my_strlen(const char * str)
{
 assert(str);
 if(*str == '\0')
     return 0;
 else
     return 1 + my_strlen(str+1);
}

                方式三:

//指针-指针的⽅式
int my_strlen(char *s)
{
 assert(str);
 char *p = s;
 while(*p != ‘\0’ )
     p++;
 return p-s;
}
        strcpy函数的使用和模拟实现
char* strcpy(char * destination, const char * source );

        模拟实现:

char *my_strcpy(char *dest, const char*src)
{ 
 char *ret = dest;
 assert(dest != NULL);
 assert(src != NULL);
 
 while((*dest++ = *src++))
 {
     ;
 }
 return ret;
}
        strcat函数的使用和模拟实现

        模拟实现:

char *my_strcat(char *dest, const char*src)
{
 char *ret = dest;
 assert(dest != NULL);
 assert(src != NULL);
 while(*dest)
 {
     dest++;
 }
 while((*dest++ = *src++))
 {
     ;
 }
 return ret;
}
        strcmp函数的使用和模拟实现

        模拟实现:

int my_strcmp (const char * str1, const char * str2)
{
 int ret = 0 ;
 assert(src != NULL);
 assert(dest != NULL);
 while(*str1 == *str2)
 {
     if(*str1 == '\0')
         return 0;
     str1++;
     str2++;
 }
 return *str1-*str2;
}
strncpy,strncmp,strncat函数的使用

上述的字符串函数都是不受长度限制使用的字符串函数,而strncpy,strncmp,strncat则受长度限制,这样使用也比较安全。

        strncpy函数的使用
 char * strncpy ( char * destination, const char * source, size_t num );

        ⽐较str1和str2的前num个字符,如果相等就继续往后⽐较,最多⽐较num个字⺟,如果提前发现不⼀ 样,就提前结束,⼤的字符所在的字符串⼤于另外⼀个。如果num个字符都相等,就是相等返回0.

        strncmp函数的使用
int strncmp ( const char * str1, const char * str2, size_t num );

        ⽐较str1和str2的前num个字符,如果相等就继续往后⽐较,最多⽐较num个字⺟,如果提前发现不⼀ 样,就提前结束,⼤的字符所在的字符串⼤于另外⼀个。如果num个字符都相等,就是相等返回0

        strncat函数的使用
char * strncat ( char * destination, const char * source, size_t num );
#include <stdio.h>
#include <string.h>
int main ()
{
 char str1[20];
 char str2[20];
 strcpy (str1,"To be ");
 strcpy (str2,"or not to be");
 strncat (str1, str2, 6);
 printf("%s\n", str1);
 return 0;
}
        strstr函数的使用和模拟实现
char * strstr ( const char * str1, const char * str2);

        函数返回字符串str2在字符串str1中第⼀次出现的位置。字符 串的⽐较匹配不包含 \0 字符,以 \0 作为结束标志。

#include <stdio.h>
#include <string.h>
int main ()
{
 char str[] ="This is a simple string";
 char * pch;
 pch = strstr (str,"simple");
 strncpy (pch,"sample",6);
 printf("%s\n", str);
 return 0;
} 

        模拟实现:

char * strstr (const char * str1, const char * str2)
{
 char *cp = (char *) str1;
 char *s1, *s2;
 if ( !*str2 )
 return((char *)str1);
 while (*cp)
 {
 s1 = cp;
 s2 = (char *) str2;
 while ( *s1 && *s2 && !(*s1-*s2) )
 s1++, s2++;
 if (!*s2)
 return(cp);
 cp++;
 }
 return(NULL);
}

内存函数

        memcpy函数的使用和模拟实现
void * memcpy ( void * destination, const void * source, size_t num );

        函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。这个函数在遇到 '\0' 的时候并不会停下来。如果source和destination有任何的重叠,复制的结果都是未定义的。

        模拟实现:

void * memcpy ( void * dst, const void * src, size_t count)
{
 void * ret = dst;
 assert(dst);
 assert(src);
 /*
 * copy from lower addresses to higher addresses
 */
 while (count--) {
     *(char *)dst = *(char *)src;
     dst = (char *)dst + 1;
     src = (char *)src + 1;
 }
 return(ret);
}
memmove函数的使用和模拟实现
void * memmove ( void * destination, const void * source, size_t num );

        和memcpy的差别就是memmove函数处理的源内存块和⽬标内存块是可以重叠的。如果源空间和⽬标空间出现重叠,就得使⽤memmove函数处理。

#include <stdio.h>
#include <string.h>
int main()
{
 int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
 memmove(arr1+2, arr1, 20);
 int i = 0;
 for (i = 0; i < 10; i++)
 {
     printf("%d ", arr2[i]);
 }
 return 0;
}

输出的结果: 1 2 1 2 3 4 5 8 9 10

        模拟实现:

void * memmove ( void * dst, const void * src, size_t count)
{
 void * ret = dst;
 if (dst <= src || (char *)dst >= ((char *)src + count)) {
 /*
 * Non-Overlapping Buffers
 * copy from lower addresses to higher addresses
 */
 while (count--) {
     *(char *)dst = *(char *)src;
     dst = (char *)dst + 1;
     src = (char *)src + 1;
 }
 }
 else {
 /*
 * Overlapping Buffers
 * copy from higher addresses to lower addresses
 */
 dst = (char *)dst + count - 1;
 src = (char *)src + count - 1;
 while (count--) {
     *(char *)dst = *(char *)src;
     dst = (char *)dst - 1;
     src = (char *)src - 1;
 }
 }
 return(ret)
}
        memset函数的使用
void * memset ( void * ptr, int value, size_t num );
#include <stdio.h>
#include <string.h>
int main ()
{
 char str[] = "hello world";
 memset (str,'x',6);
 printf(str);
 return 0;
}

输出结果:xxxxxxworld

        memcmp函数的使用
int memcmp ( const void * ptr1, const void * ptr2, size_t num );
#include <stdio.h>
#include <string.h>
int main()
{
 char buffer1[] = "DWgaOtP12df0";
 char buffer2[] = "DWGAOTP12DF0";
 int n;
 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;
}

  • 24
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值