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

  • 自己实现strstr函数,如果找到返回首地址,找不到则返回NULL
 //查找元素,返回首地址
char *mystrstr(const char *_Str,const char *_SubStr)
{
//如果有一个为空,则返回NULL
if (_Str == NULL || _SubStr == NULL)
{
return NULL;
} //psrc,psub保存源字符串和子字符串当前查询到的地址
char *psrc = _Str;
char *psub = _SubStr; //如果源字符串没有遍历晚,则继续遍历
while (*psrc != '\0')
{
//创建新的临时地址,保存当前遍历到的地址
char *ptmp_src = psrc;
char *ptmp_sub = psub;
int flag = ;//首先假设字符串找到
//如果自字符串没有遍历完,则继续遍历
while (*ptmp_sub != '\0')
{
//如果源字符串提前结束,则返回NULL
if (*ptmp_src == '\0')
{
return NULL;
}
//如果当前遍历到的不相等,则flag置0,跳出循环
if (*ptmp_src != *ptmp_sub)
{
flag = ;
break;
}
else//否则同时向后移动一位
{
ptmp_src++;
ptmp_sub++;
}
}
//如果找到了返回首地址
if (flag)
{
return psrc;
}
//如果没找到源字符串向后移动一位,再进行遍历
psrc++;
} return NULL;
}
  • 自己实现strlen函数
 unsigned int mystrlen(const char *str)
{
int length = ;
for (int i = ;; i++)
{
if (*(str + i) == '\0')
{
break;
}
length++;
}
return length;
}
  • 自己实现strcpy函数
 char *mystrcpy(char *dest, const char *source)
{
if (dest == NULL || source == NULL)
{
return NULL;
}
for (int i = ;; i++)
{
dest[i] = source[i];
if (*(source + i) == '\0')
{
break;
} return dest;
}
}

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

  • 字符串的排序调用qsort
 int compare(const void *p1, const void *p2)//传递的是数组元素的地址,类型是**,要先转化为**的指针
{
const char **pstr1 = p1;
const char **pstr2 = p2;
//去每个元素首地址比较两个字符串
return strcmp(*pstr1, *pstr2);
} void main()
{
char *str[] = { "calc","apple","run","" ,"boat","dead","father","son","hello",""};
qsort(str, , , compare);
for (int i = ; i < ; i++)
{
puts(str[i]);
}
system("pause");
}
  • 字符串的排序,冒泡法
 void main()
{
char str[][] = { "calc","apple","run","" ,"boat","dead","father","son","hello","" }; for (int i = ; i < - ; i++)//控制次数
{
for (int j = ; j < - i - ; j++)//两个两个比较,大数沉底
{
if (strcmp(str[j], str[j + ]) > )
{
char strtemp[] = { };
strcpy(strtemp, str[j]);
strcpy(str[j], str[j + ]);
strcpy(str[j + ], strtemp);
} }
}
for (int i = ; i < ; i++)
{
puts(str[i]);
}
system("pause");
}
  • 自己实现strcmp
 int mystrcmp(const char * _Str1, const char * _Str2)
{
if (_Str1 == NULL || _Str2 == NULL)
{
return ;
}
char *pstr1 = _Str1;
char *pstr2 = _Str2;
//一直循环到两个字符不相等
while (*pstr1 == *pstr2 && *pstr1 != '\0')
{
pstr1++;
pstr2++;
}
//如果都到两个字符串结尾
if (*pstr1 == '\0' && *pstr2 == '\0')
{
return ;
}
//如果有一个到结尾
else if (*pstr1 == '\0' && *pstr2 != '\0')
{
return -;
}
else if (*pstr1 != '\0' && *pstr2 == '\0')
{
return ;
}
//如果都没到结尾
else
{
return *pstr1 > *pstr2 ? : -;
}
}

不常用的字符串函数 

  • 自己实现strset(char *p,char ch):填充字符串

     void mystrset(char *p, char ch)
    {
    while (*p!=NULL)
    {
    *p = ch;
    p++;
    } }
  • 自己实现strrev(char *p)
     void mystrrev(char *p)
    {
    int len = strlen(p);
    for (int i = ; i < len/; i++)
    {
    p[i] = p[len - -i];
    }
    }
  • 自己实现_strlwr(字符串大写转小写)
     void mystrlwr(char *p)
    {
    while (*p != '\0')
    {
    if (*p >= 'A' && *p <= 'Z')
    {
    (*p) += ;
    }
    p++;
    }
    }
  • 自己实现_strupr(字符串小写转大写)
     void mystrupr(char *p)
    {
    while (*p != '\0')
    {
    if (*p >= 'a' && *p <= 'z')
    {
    (*p) -= ;
    }
    p++;
    }
    }

38.C语言字符串总结的更多相关文章

  1. C.【转】C语言字符串与数字相互转换

    1.gcvt 把浮点数转成字符串 - CSDN博客.html(https://blog.csdn.net/dxuehui/article/details/52791412) 1.1. 函数名: gcv ...

  2. C语言字符串操作总结大全(超详细)

    本篇文章是对C语言字符串操作进行了详细的总结分析,需要的朋友参考下 1)字符串操作  strcpy(p, p1) 复制字符串  strncpy(p, p1, n) 复制指定长度字符串  strcat( ...

  3. C语言字符串拷贝

    C语言字符串拷贝利用指针操作,要清楚知道指针的指向 代码如下: #include <stdio.h> #include <assert.h> #include <stri ...

  4. C语言字符串长度(转)

    C语言字符串长度的计算是编程时常用到的,也是求职时必考的一项. C语言本身不限制字符串的长度,因而程序必须扫描完整个字符串后才能确定字符串的长度. 在程序里,一般会用strlen()函数或sizeof ...

  5. C语言字符串操作常用库函数

    C语言字符串操作常用库函数 *********************************************************************************** 函数 ...

  6. c语言字符串操作大全

     C语言字符串操作函数 函数名: strcpy 功  能: 拷贝一个字符串到另一个 用  法: char *stpcpy(char *destin, char *source); 程序例: #incl ...

  7. 转:C语言字符串操作函数 - strcpy、strcmp、strcat、反转、回文

    转自:C语言字符串操作函数 - strcpy.strcmp.strcat.反转.回文 C++常用库函数atoi,itoa,strcpy,strcmp的实现 作者:jcsu C语言字符串操作函数 1. ...

  8. C 语言字符串连接的 3种方式

    C 语言字符串连接的 3种方式 #include<stdio.h> #include<stdlib.h> #include<string.h> char *join ...

  9. C语言字符串声明

    重新学习C语言字符串声明char *a="nihao";char a[]="nihao";什么区别?前者定义的是指针,并且指向字符串常量“nihao”,后者是字 ...

随机推荐

  1. 使用ajax验证用户名重复

    继上次的用户注册登录案例之后,对其中的部分功能再做进一步改进.上一版中用户提交表单后才对用户名进行校验,虽然做了回显,但还是感觉功能弱了些.为了能有更好用户体验,不是在用户提交表单后才给提示,而是在用 ...

  2. ASP.NET 获取IIS应用程序池的托管管道模式

    asp.net 中怎样较为简单的获取网站程序池的托管管道模式 目前已知的方式是根据这个帖子https://github.com/kakalotte/... ,利用DirectoryEntry,但是程序 ...

  3. jqueryEasyui重新渲染

    转载: jQuery EasyUI parser 的使用场景 | WebUI框架使用参考+http://www.easyui.info/archives/216.html parser,故名意思,就是 ...

  4. 联想服务器thinkserver TS550 Raid5制作及winserver2012R2 安装过来

    一. 联想服务器thinkserver TS550 Raid5制作 1.开机后按ctrl+i  进入raid配置模式 2.选择“1”配置所需Raid模式(这次配的是raid5) 3.按提示确认后退出 ...

  5. 【Henu ACM Round#20 C】 Eevee

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 处理处所有的字符串可能的样子. 存在map里面就好. [代码] #include <bits/stdc++.h> usi ...

  6. ArcGIS api for javascript——地图配置-定制缩放动画

    描述 本例展示了当用户放大或缩小地图时如何定义地图的动画.zoomDuration和zoomRate是Dojo动画属性,他们确定了动画的duration和帧刷新的rate .这些属性单位是毫秒,zoo ...

  7. Android导入工程提示Invalid project description

    在eclipse里导入的时候报错,提示 Invalid project description. 解决的方法: 在eclipse的workspace中,找到.metadata目录,依次打开------ ...

  8. Python(六) Python 函数

    一.认识函数 help(方法名字)  help(round) 1.功能性 2.隐藏细节 3.避免编写重复的代码 4.组织代码 自定义函数 二.函数的定义及运行特点 # 递归 def sum_num(n ...

  9. HTTP 协议基础及发展历史

    一. 5层网络模型介绍 低三层 物理层:主要作用是定义物理设备如何传输数据. 数据链路层:在通信的实体间建立数据链路连接. 网路层:为数据在结点之间传输创建逻辑链路. 传输层: 想用户提供可靠的端到端 ...

  10. POJ 1610 Count the Colors

    Count the Colors Time Limit: 2 Seconds      Memory Limit: 65536 KB Painting some colored segments on ...