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

两者形式:

字符指针: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. 如何避免jQuery库和其他库的冲突

    默认情形:jQuery用$作为自身的快捷方式 1. jQuery库在其他库之后导入 (1)方法:使用jQuery.noConflict()函数将变量$的控制权转移给其他库 (2)操作: (a)在js代 ...

  2. Bzoj 1609: [Usaco2008 Feb]Eating Together麻烦的聚餐 二分

    1609: [Usaco2008 Feb]Eating Together麻烦的聚餐 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1272  Solve ...

  3. In Java, what is the default location for newly created files?

    If the current directory of the application. If e.g. you create a File by using new FileOutputStream ...

  4. SQL语句的增删改查

    一.增:有2种方法 1.使用insert插入单行数据: 语法:insert [into] <表名> [列名] values <列值> 例:insert into Strdent ...

  5. sql server2008报“评估已过期....."

    开始-->所有程序-->Microsoft SQL Server 2008-->配置工具-->SQL Server 安装中心-->维护-->版本升级,接着按照提示一 ...

  6. WebSocket与Tcp连接

    最近做了一个项目,客户端为WebSocket页面,服务器端为Tcp控制台 .将代码贴出来,供需要的参考. 1.服务器端代码 其中服务器的Session使用了第三方插件,为TCP连接. 2.客户端代码如 ...

  7. inline-block元素之间出现间隙

    一.问题 这里部分的组成是一个input框和一个a按钮,然后a标签为了设置它的width和height我让他display:inline-block(行内元素以块级元素显示内容).神奇的一幕出现了,两 ...

  8. Ajax交互demo1

    一.概念 Ajax异步请求刷新. 浏览器在用户不知道的情况下,偷偷地跟服务器交互,然后返回数据给浏览器显示. 异步过程:当HTTP请求发送后,通过Ajax技术使用的XMLHttpRequest对象来发 ...

  9. 利用Ajax把前端的数据封装成JSON格式发送到服务器端并写成XML格式在服务器的硬盘上

    1.首先要在前端把要发送的东西(这里是一个实例化的car对象)都准备好,利用Ajax发送到服务器端,代码如下: <html xmlns="http://www.w3.org/1999/ ...

  10. 怎样在win7下装ubuntu(硬盘版安装)

    1)首先还是分区,在计算机上右键--管理--磁盘管理 装Ubuntu分配的硬盘大小最好是(20G以上)不要太小,这里请注意,ubuntu和windows文件系统全然不同,所以我们划好要给ubuntu的 ...