博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
38.C语言字符串总结
阅读量:5322 次
发布时间:2019-06-14

本文共 4444 字,大约阅读时间需要 14 分钟。

1.自己实现三个常用函数 strlen,strcpy,strstr

  • 自己实现strstr函数,如果找到返回首地址,找不到则返回NULL
1 //查找元素,返回首地址 2 char *mystrstr(const char *_Str,const char *_SubStr) 3 { 4     //如果有一个为空,则返回NULL 5     if (_Str == NULL || _SubStr == NULL) 6     { 7         return NULL; 8     } 9 10     //psrc,psub保存源字符串和子字符串当前查询到的地址11     char *psrc = _Str;12     char *psub = _SubStr;13 14     //如果源字符串没有遍历晚,则继续遍历15     while (*psrc != '\0')16     {17         //创建新的临时地址,保存当前遍历到的地址18         char *ptmp_src = psrc;19         char *ptmp_sub = psub;20         int flag = 1;//首先假设字符串找到21         //如果自字符串没有遍历完,则继续遍历22         while (*ptmp_sub != '\0')23         {24             //如果源字符串提前结束,则返回NULL25             if (*ptmp_src == '\0')26             {27                 return NULL;28             }29             //如果当前遍历到的不相等,则flag置0,跳出循环30             if (*ptmp_src != *ptmp_sub)31             {32                 flag = 0;33                 break;34             }35             else//否则同时向后移动一位36             {37                 ptmp_src++;38                 ptmp_sub++;39             }40         }41         //如果找到了返回首地址42         if (flag)43         {44             return psrc;45         }46         //如果没找到源字符串向后移动一位,再进行遍历47         psrc++;48     }49 50     return NULL;51 }

 

  • 自己实现strlen函数
1 unsigned int mystrlen(const char *str) 2 { 3     int length = 0; 4     for (int i = 0;; i++) 5     { 6         if (*(str + i) == '\0') 7         { 8             break; 9         }10         length++;11     }12     return length;13 }
  • 自己实现strcpy函数
1 char *mystrcpy(char *dest, const char *source) 2 { 3     if (dest == NULL || source == NULL) 4     { 5         return NULL; 6     } 7     for (int i = 0;; i++) 8     { 9         dest[i] = source[i];10         if (*(source + i) == '\0')11         {    12             break;13         }14 15         return dest;16     }17 }

 2.字符串的排序以及自己实现strcmp

  • 字符串的排序调用qsort
1 int compare(const void *p1, const void *p2)//传递的是数组元素的地址,类型是**,要先转化为**的指针 2 { 3     const char **pstr1 = p1; 4     const char **pstr2 = p2; 5     //去每个元素首地址比较两个字符串 6     return strcmp(*pstr1, *pstr2); 7 } 8  9 void main()10 {11     char *str[10] = { "calc","apple","run","123" ,"boat","dead","father","son","hello","2018"};12     qsort(str, 10, 4, compare);13     for (int i = 0; i < 10; i++)14     {15         puts(str[i]);16     }17     system("pause");18 }
  •  字符串的排序,冒泡法
1 void main() 2 { 3     char str[10][10] = { "calc","apple","run","123" ,"boat","dead","father","son","hello","2018" }; 4  5     for (int i = 0; i < 10 - 1; i++)//控制次数 6     { 7         for (int j = 0; j < 10  - i - 1; j++)//两个两个比较,大数沉底 8         { 9             if (strcmp(str[j], str[j + 1]) > 0)10             {11                 char strtemp[100] = { 0 };12                 strcpy(strtemp, str[j]);13                 strcpy(str[j], str[j + 1]);14                 strcpy(str[j + 1], strtemp);15             }16             17         }18     }19     for (int i = 0; i < 10; i++)20     {21         puts(str[i]);22     }23     system("pause");24 }
  •  自己实现strcmp
1 int mystrcmp(const char * _Str1, const char * _Str2) 2 { 3     if (_Str1 == NULL || _Str2 == NULL) 4     { 5         return 0; 6     } 7     char *pstr1 = _Str1; 8     char *pstr2 = _Str2; 9     //一直循环到两个字符不相等10     while (*pstr1 == *pstr2 && *pstr1 != '\0')11     {12         pstr1++;13         pstr2++;14     }15     //如果都到两个字符串结尾16     if (*pstr1 == '\0' && *pstr2 == '\0')17     {18         return 0;19     }20     //如果有一个到结尾21     else if (*pstr1 == '\0' && *pstr2 != '\0')22     {23         return -1;24     }25     else if (*pstr1 != '\0' && *pstr2 == '\0')26     {27         return 1;28     }29     //如果都没到结尾30     else 31     {32         return *pstr1 > *pstr2 ? 1 : -1;33     }34 }

不常用的字符串函数 

  • 自己实现strset(char *p,char ch):填充字符串
    1 void mystrset(char *p, char ch)2 {3     while (*p!=NULL)4     {5         *p = ch;6         p++;7     }8 9 }

     

  • 自己实现strrev(char *p)
    1 void mystrrev(char *p)2 {3     int len = strlen(p);4     for (int i = 0; i < len/2; i++)5     {6         p[i] = p[len - 1 -i];7     }8 }

     

  • 自己实现_strlwr(字符串大写转小写)
    1 void mystrlwr(char *p) 2 { 3     while (*p != '\0') 4     { 5         if (*p >= 'A' && *p <= 'Z') 6         { 7             (*p) += 32; 8         } 9         p++;10     }11 }

     

  • 自己实现_strupr(字符串小写转大写)
    1 void mystrupr(char *p) 2 { 3     while (*p != '\0') 4     { 5         if (*p >= 'a' && *p <= 'z') 6         { 7             (*p) -= 32; 8         } 9         p++;10     }11 }

     

转载于:https://www.cnblogs.com/xiaochi/p/8337868.html

你可能感兴趣的文章
windows编程ASCII问题
查看>>
.net webService代理类
查看>>
C#高级编程笔记(一)
查看>>
Code Snippet
查看>>
MFC模态对话框程序不响应OnIdle
查看>>
Node.js Express项目搭建
查看>>
zoj 1232 Adventure of Super Mario
查看>>
Oracle 序列的应用
查看>>
1201 网页基础--JavaScript(DOM)
查看>>
组合数学 UVa 11538 Chess Queen
查看>>
oracle job
查看>>
Redis常用命令
查看>>
EFCode First 导航属性
查看>>
XML学习笔记(二)-- DTD格式规范
查看>>
I - Agri-Net - poj 1258
查看>>
git 的回退
查看>>
IOS开发学习笔记026-UITableView的使用
查看>>
Confluence配置数据库
查看>>
Java锁机制(一)synchronized
查看>>
002.文件删除功能
查看>>