《一》,字符指针&字符数组

两者形式:

字符指针:char *p;

字符数组:char str[100];

两者区别:

字符指针p是变量;

字符数组str是常量;

访问元素方式:

字符指针:*(p+i) || p[i],    访问第i个元素;

字符数组:*(str+i) || str[i]   访问第i个元素;

利用 sizeof() 求大小:

字符指针: sizeof(p) = 4,       sizeof(p)求的是指针p所占的空间,恒为4字节;

字符数组: sizeof(str) = 100, sizeof(str)求的是数组str的真实空间,100;

字符串函数strlen()说明:

strlen()仅仅求出字符串中第一个'\0'之前的字符个数,

printf("%s",str)只输出第一个'\0'之前的字符个数;

函数原型:

int strlen(char *p)

{

int count=0;

if(p==NULL)

return count;

while(*p++ != '\0')

count++;

return count;

}

简单实例:

 #define  _CRT_SECURE_NO_WARNINGS //关闭安全检查
#include<stdio.h>
#include<stdlib.h>
#include<string.h> //for语句
int mystrlen(char* str)
{
int i = ;
for (char*p = str; *p != '\0'; p++)
{
i++;
}
return i;//实现字符串统计
} //go语句
int mystrlenA(char* str)
{
char *p = str;
int i = ;
AAA: if (*p!='\0')
{
i++;
p++;
goto AAA;
}
return i;
} //递归实现
int mystrlenB(char *str)
{
if (*str=='\0')
{
return ;
}
else
{
return + mystrlenB(++str);
} } void main()
{
char str[] = "china is good";
char *p = str;
char *q = malloc(sizeof(char)*);
q = "hello,i am q";
printf("str:%s",str);
printf("\nsizeof(str):%d", sizeof(str));
printf("\nstrlen(str):%d", strlen(str));
printf("\n\np:%s", p);
printf("\nsizeof(p):%d", sizeof(p));
printf("\nstrlen(p):%d", strlen(p));
printf("\n\nq:%s", q);
printf("\nsizeof(q):%d", sizeof(q));
printf("\nstrlen(q):%d", strlen(q)); printf("\n%d", mystrlen(str));//从开头第一个字符到\0字符
printf("\n%d", mystrlenA(str));
printf("\n%d", mystrlenB(str)); getchar();
}

运行结果:

《二》

字符串库实现:

String.h

 #define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h> //字符串封装,需要库函数
//不需要库函数
struct CString
{
char *p;//保存字符串首地址
int reallength;//实际长度
};
typedef struct CString mystring;//简写 //字符串,初始化,打印,
//查找,查找字符,查找字符串
//尾部增加,(字符,字符串)
//删除(字符,字符串),
//任意位置增加(字符,字符串) ////修改字符串,(字符,字符串替换) void init(mystring *string);//原封不动初始化
void initwithlength(mystring *string,int length);//开辟长度,内存清零
void initwithstring(mystring *string,char *copystring);//初始化并拷贝字符串
void printfstring(mystring *string); //打印
void backaddchar(mystring *string,char ch);//增加字符
void backaddstring(mystring *string,char*str);//增加字符串
void run(mystring *string);//执行指令
char * findfirstchar(mystring *string, char ch);//返回第一个找到的字符的地址
char * findfirststring(mystring *string, char *str);//返回第一个找到的字符串的地址
int deletefirstchar(mystring *string,const char ch);//删除第一个找到的字符
int deletefirststring(mystring *string, char * const str);//删除第一个找到的字符串
void addchar(mystring *string, char ch,char *pos);//任意增加字符
void addstring(mystring *string, char*str,char *pos);//任意增加字符串
void changefirstchar(mystring *string, const char oldchar, const newchar);//改变字符
void changefirststring(mystring *string, char * const oldstring, char *const newstring);//改变字符串

String.c

 #include"字符串.h"

 int mystrlen(char *p)
{
if (p == NULL)
{
return -;//失败,
}
int length = ;
while (*p != '\0')//字符串终止条件
{
length++;//长度自增
p++;//指针不断向前
}
return length; }
char *mystrcpy(char *dest, const char *source)//const限定不被意外修改
{
if (dest == NULL || source == NULL)
{
return NULL;//为空没有必要干活了
}
char * destbak = dest;
while (*source != '\0')//一直拷贝
{
*dest = *source;//赋值字符
source++;
dest++;//指针不断向前,字符挨个赋值
}
*dest = '\0';//结尾
return destbak;//返回地址 } char *mystrcat(char *dest, const char *source)
{
if (dest == NULL || source == NULL)
{
return NULL;//失败
}
else
{
char *destbak = dest;//保留地址
while (*dest != '\0')
{
dest++;//指针向前移动
}
//从尾部开始拷贝
while (*source != '\0') //循环被被拷贝的字符串
{
*dest = *source;//字符串赋值
dest++;
source++; }
*dest = '\0';//结尾
return destbak; } } char * mystrchr(const char *dest, const char ch)
{
if (dest == NULL)
{
return NULL;
} while (*dest!='\0')
{
if (*dest == ch)
{
return dest;//找到返回地址
}
dest++;
}
return NULL;//返回 } char *mystrstr(const char * const dest, const char * const findstr)
{
if (dest == NULL || findstr == NULL)
{
return NULL;
}
char *destbak = dest;
char *p = NULL;//保存找到的地址
while (*destbak != '\0')
{
int flag = ;//假定是相等
char *findstrbak = findstr;
char *nowdestbak = destbak;
while (*findstrbak != '\0')
{
if (*nowdestbak != '\0')
{ if (*findstrbak != *nowdestbak)//有一个不等
{
flag = ;//赋值为0代表不等
}
nowdestbak++;
findstrbak++;
}
else
{
flag = ;//设置标识
break;
} }
if (flag == )
{
p = destbak;//当前位置
return p;
} destbak++;
} return NULL; } void init(mystring *string)
{
string->p = NULL;
string->reallength = ;//初始化结构体字符串
}
void initwithlength(mystring *string, int length)
{
//string->p =(char *) malloc(sizeof(char)*length);//分配内存
string->p = (char *)calloc(length, sizeof(char));//分配内存并清零
string->reallength = length;//长度 }
void initwithstring(mystring *string, char *copystring)
{
int length = strlen(copystring);//获取字符串长度
string->p =(char *) calloc(length + , sizeof(char));//分配内存
mystrcpy(string->p, copystring);//拷贝字符串
string->reallength = length + ;//设置长度 }
void backaddchar(mystring *string,char ch)
{ if (mystrlen(string->p)+==string->reallength)//意味着满了
{
//重新分配内存
string->p = realloc(string->p, string->reallength + );
string->reallength += ;
string->p[string->reallength - ] = ch;
string->p[string->reallength - ] = '\0'; }
else
{
int nowlength = mystrlen(string->p);//求出当前长度
string->p[nowlength] = ch;
string->p[nowlength + ] = '\0';//字符的增加 } }
void backaddstring(mystring *string, char*str)
{
int nowmystringlength = mystrlen(string->p);//获取当前长度
int addstringlength = mystrlen(str);//要增加的长度
if (nowmystringlength + addstringlength+ >string->reallength)//判定是否越界
{
int needaddlength = nowmystringlength + addstringlength + - (string->reallength);
//printf("%d", needaddlength);
string->p = (char *)realloc(string->p, string->reallength + needaddlength);//增加字符串长度
mystrcat(string->p, str);//拷贝字符串
string->reallength += needaddlength;//增加长度 }
else
{
mystrcat(string->p, str);//拷贝字符串 } }
void printfstring(mystring *string)
{ printf("\nstring=%s", string->p);//打印字符串 }
void run(mystring *string)
{ system(string->p);//执行指令
} char * findfirstchar(mystring *string, char ch)
{
char *p = mystrchr(string->p, ch);//查找
return p; }
char * findfirststring(mystring *string, char *str)
{ char *pres = mystrstr(string->p, str);
return pres;//返回地址 }
int deletefirstchar(mystring *string, const char ch)
{ char *p = mystrchr(string->p, ch);//查找
if (p == NULL)
{
return ; }
else
{ char *pnext = p + ;
while (*pnext != '\0')
{
*p = *pnext; //删除一个字符整体向前移动
p++;
pnext++;
}
*p = '\0';//字符串要有结尾
return ;
} }
int deletefirststring(mystring *string, char * const str)
{
char *pres = mystrstr(string->p, str);//查找
if (pres == NULL)
{
return ; }
else
{
int length = mystrlen(str);//求字符串长度
char *pnext = pres + length;//下一个字符
while (*pnext != '\0')
{
*pres = *pnext; //删除一个字符整体向前移动
pres++;
pnext++; }
*pres = '\0';//字符串要有结尾
return ;
} } void addchar(mystring *string, char ch, char *pos)
{
if (pos == NULL || string ==NULL)
{
return;
}
if(mystrlen(string->p) + == string->reallength)//意味着满了
{
//重新分配内存
string->p = realloc(string->p, string->reallength + );
string->reallength += ; int nowlength = mystrlen(string->p);//求出当前长度
int movelength = mystrlen(pos);//求出现在要移动的长度
for (int i = nowlength; i > nowlength - movelength; i--)//移动
{
string->p[i] = string->p[i - ];//轮询
}
string->p[nowlength - movelength] = ch;//插入 string->p[nowlength + ] = '\0';//结尾 }
else
{
int nowlength = mystrlen(string->p);//求出当前长度
int movelength = mystrlen(pos);//求出现在要移动的长度
for (int i = nowlength; i > nowlength-movelength; i--)//移动
{
string->p[i] = string->p[i - ];//轮询
}
string->p[nowlength - movelength]=ch;//插入
string->p[nowlength + ] = '\0';//结尾 } }
void addstring(mystring *string, char*str, char *pos)//任意增加字符串
{
if (pos == NULL || string == NULL)
{
return;
}
int nowmystringlength = mystrlen(string->p);//获取当前长度
int addstringlength = mystrlen(str);//要增加的长度
if (nowmystringlength + addstringlength + >string->reallength)//判定是否越界
{
int needaddlength = nowmystringlength + addstringlength + - (string->reallength);
//printf("%d", needaddlength);
string->p = (char *)realloc(string->p, string->reallength + needaddlength);//增加字符串长度
string->reallength += needaddlength;//增加长度 //先移动,再拷贝
int nowlength = mystrlen(string->p);//求出当前长度
int movelength = mystrlen(pos);//求出现在要移动的长度
int insertlength = strlen(str);//要求出插入的长度 for (int i = nowlength; i >=nowlength-movelength ; i--)
{
string->p[i + insertlength]=string->p[i];//字符移动
}
for (int j = ; j < insertlength;j++)
{
string->p[nowlength-movelength+j]= str[j];//赋值拷贝
} }
else
{
int nowlength = mystrlen(string->p);//求出当前长度
int movelength = mystrlen(pos);//求出现在要移动的长度
int insertlength = strlen(str);//要求出插入的长度
for (int i = nowlength; i >= nowlength - movelength; i--)
{
string->p[i + insertlength] = string->p[i];//字符移动
}
for (int j = ; j < insertlength; j++)
{
string->p[nowlength - movelength + j] = str[j];//赋值拷贝
} // } }
void changefirstchar(mystring *string, const char oldchar, const newchar)//改变字符
{
char *pstr = string->p;
while (*pstr != '\0')
{
if (*pstr == oldchar)//查找
{
*pstr = newchar;//赋值
return;
}
pstr++;
} }
void changefirststring(mystring *string, char * const oldstring, char *const newstring)//改变字符串
{
char *pfind = findfirststring(string, oldstring);//找到位置
if (pfind != NULL)
{
deletefirststring(string, oldstring);//删除
addstring(string, newstring, pfind);//插入
} }

特别说明:《C Primer Plus》第五版 第10章有数组,指针,函数的详细讨论,11章详细介绍字符串·相关操作;

C字符串总结+字符串库实现(增,改,删,查):的更多相关文章

  1. python数据类型—列表(增改删查,统计,取值,排序)

    列表是最常用的数据类型之一,通过列表可以对数据实现方便的存储,修改等操作. 先声明一个空列表: >>> names = [] >>> names [] 可以存多个值 ...

  2. DataFrame查增改删

    DataFrame查增改删 查 Read 类list/ndarray数据访问方式 dates = pd.date_range(',periods=10) dates df = pd.DataFrame ...

  3. XML简单的增改删操作

    XML文件的简单增改删,每一个都可以单独拿出来使用. 新创建XML文件,<?xmlversion="1.0"encoding="utf-8"?> & ...

  4. js 属性增改删操作

    js 属性增改删操作,可参看菜鸟教程,这里记录一个小问题:disabled属性 使用setAttribute操作无法 禁用disabled属性,需使用removeAttribute操作,原因是只要有d ...

  5. php-数据库访问--增、删、改

    建立一个登录页面 <form action="chuli.php" method="post"> <div>用户名:<input ...

  6. EF6增改删等常用基类

    using System; using System.Linq; using System.Threading.Tasks; using System.Linq.Expressions; using ...

  7. oracle函数自治事务解决不能增改删的语句操作

    CREATE OR REPLACE FUNCTION SEQ3 (v_bname in VARCHAR2) return NUMBER is pragma autonomous_transaction ...

  8. WPF中DataGrid的应用-绑定,增改删,分页,样式

    参考以下网址: http://www.cnblogs.com/fwbnet/archive/2012/05/08/2490974.html

  9. Linq To Sql 增改删

    using System; using System.Data.Linq.Mapping; namespace ConsoleApplication3 { [Table(Name = "te ...

  10. MongoDB 基本操作(增改删)

    1.插入数据 和关系型数据库一样,增加数据记录可以使用insert语句,这是很简单的. 当插入数据时,如果此集合不存在,则MongoDB系统会自动创建一个集合,即不需要刻意预先创建集合 每次插入数据时 ...

随机推荐

  1. RGB Bayer Color分析

    RGB Bayer Color分析 Bayer色彩滤波阵列 拜耳色彩滤波阵列(Bayer Color Filter Array,CFA)是非常有名的彩色图片的数字采集格式.色彩滤波器的模式如上图所示, ...

  2. Closure Compiler(封闭编辑器), Closure Inspector, Closure Templates, 封闭图书馆(Closure Library) Google- 摘自网络

    谷歌日前宣布,将自己开发者使用的一系列工具对外开放.这些工具曾用来开发谷歌的主要产品,包括Gmail.谷歌文档(Google Docs)和谷歌地图(Google Maps). 第一个工具叫做Closu ...

  3. Windows和Ubuntu双系统,修复UEFI引导的两种办法

    查看ubuntu是否是从 efi/uefi 启动的方法:  若 /sys/firmware/efi 存在则是,否则不是.shell命令: [ -d /sys/firmware/efi ] && ...

  4. mahout算法源码分析之Collaborative Filtering with ALS-WR (四)评价和推荐

    Mahout版本:0.7,hadoop版本:1.0.4,jdk:1.7.0_25 64bit. 首先来总结一下 mahout算法源码分析之Collaborative Filtering with AL ...

  5. Android中实现控件圆角边框

    首先,在drawable文件夹下新建一个xml文件: <?xml version="1.0" encoding="utf-8"?> <shap ...

  6. Java多线程——Executors和线程池

    线程池的概念与Executors类的应用 1.创建固定大小的线程池 package java_thread; import java.util.concurrent.ExecutorService; ...

  7. linq 学习笔记(一)

    First: 找到符合条件的第一记录,就返回了,不管后面还有多少数据. Single: 先将记录都梳理一次,再找到符合要求的唯一记录.   Single():操作一个集合,同时强要求只有一个对象匹配, ...

  8. CodeForces - 269C Flawed Flow

    http://codeforces.com/problemset/problem/269/C 题目大意: 给定一个边没有定向的无法增广的残量网络且1是源点,n是汇点,给定每条边中的流.  让你把所有边 ...

  9. Linux中查看系统资源占用情况的命令【转载】

      用 'top -i' 看看有多少进程处于 Running 状态,可能系统存在内存或 I/O 瓶颈,用 free 看看系统内存使用情况,swap 是否被占用很多,用 iostat 看看 I/O 负载 ...

  10. (转)Zend Studio 10.6.1破解注册图文详解

    原文来自:http://www.softown.cn/soft/zend-studio/windows/10.6.1#downloads 下面我们以Zend Studio 10.6.1正式版为例来介绍 ...