目录
1、gets()输入
int myGets(char *p)
{
int cnt = 0;
if(p == NULL){
printf("内存非法");
return -1;
}
while(*p = getchar()){
if(*p == '\n'){ //以回车结束
*p = '\0';
break;
}else{
cnt++;
p++;
}
}
return cnt; //返回输入字符串长度
}
2、puts()输出
void myPuts(char *p)
{
while(*p != '\0'){
putchar(*p++);
}
putchar('\n'); //puts自带回车
return;
}
3、strlen()计算字符串长度
int myStrlen(char *p)
{
int n = 0;
while(*p != '\0'){
n++;
p++;
}
return n;
}
4、memset()初始化字符串
void myMemset(char *p, char a, int n)
{
while(n){
*p = a;
p++;
n--;
}
return;
}
1-4的demo
int main()
{
int n;
int cnt;
char str[128];
myMemset(str, 'a', 128); //初始化为a
str[127] = '\0'; //最后一个位置赋结束符
myPuts(str); //输出
cnt = myGets(str); //输入
n = myStrlen(str); //计算字符串长度
myPuts(str); //输出
printf("cnt=%d,n=%d\n",cnt,n); //验证输入的长度,和strlen出来的长度是否一样
return 0;
}
/*
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
xiao wei
xiao wei
cnt=8,n=8
*/
5、strcpy()拷贝
char* myStrcpy(char *p, char *src)
{
if(p == NULL || src == NULL){
return NULL;
}
while(*src != '\0'){
*p = *src;
p++;
src++;
}
*p = '\0'; //最后结束符
return p;
}
6、strcat()拼接
void myStrcat(char *str, char *sr)
{
while(*str != '\0'){
str++;
}
while(*sr != '\0'){
*str++ = *sr++;
}
*str = '\0';
}
7、strcmp()比较
int myStrcmp(char *str, char *src)
{
int size1 = 0;
int size2 = 0;
while(*str != '\0'){ //先比较2个字符串的个数
size1++;
str++;
}
while(*src != '\0'){
size2++;
src++;
}
if(size1 > size2)
return 1;
else if(size1 < size2)
return -1;
str -= size1; //因为前面的指针移动,所以要恢复回去
src -= size2;
while(*str != '\0' && *src != '\0'){
if(*str > *src)
return 1;
else if(*str < *src)
return -1;
str++;
src++;
}
return 0;
}
5-7的demo
int main()
{
char *src = "xiao wei";
char *sr = " !!!";
char str[128] = {'\0'};
myStrcpy(str, src); //cp字符串
myPuts(str);
printf("strcmp 1: %d\n",myStrcmp(str,src)); //比较,现在2字符串是相同的,因为前面的拷贝
myStrcat(str, sr); //拼接字符串
myPuts(str);
printf("strcmp 2: %d\n",myStrcmp(str,src)); //比较,因为前面拼接,所以str大于scr,返回1
return 0;
}
/*
xiao wei
strcmp 1: 0
xiao wei !!!
strcmp 2: 1
*/
8、strchr()查找字符
返回字符位置的地址
char* myStrchr(char *p, char a)
{
while(*p != '\0'){
if(*p == a){
return p;
}
p++;
}
return NULL;
}
9、strlwr()转换小写字母
转的字符串必须是char str[128]出来的,char *src = "Xiao Wei !!!";出来的,会在转小写那里段错误
本质原因:char *src = "Xiao Wei !!!"; 存放在常量区,是无法修改的。而数组是存放在栈中,是可以修改的。
参考博文
char* myStrlwr(char *str)
{
char *p = str;
while(*p != '\0')
{
if(*p > 'A' && *p <= 'Z')
{
*p += 32; //转小写,,,这里出现段错误
}
p++;
}
return str;
}
8-9的demo
int main()
{
//char *src = "Xiao Wei !!!"; //这样写,无法修改,会出现段错误
/* 可以下面这样写,malloc分配内存
char *src;
src = (char *)malloc(sizeof(char)*20);
strcpy(src, "Xiao Wei !!!");
*/
char src[20] = "Xiao Wei !!!";
char *str = NULL;
char a = 'a';
str = myStrchr(src, 'e');
if(str == NULL){
printf("No char\n");
}else{
myPuts(str);
}
printf("strLwr:%s\n",myStrlwr(src));
return 0;
}
/*
ei !!!
strLwr:xiao wei !!!
*/
10、strtok()字符串分割
该函数参考strtok函数源码
该函数返回被分割的第一个子字符串,如果没有可检索的字符串,则返回一个空指针
char* my_strtok(char* string_org,const char* demial)
{
static unsigned char* last;
unsigned char* str;
const unsigned char* ctrl = (const unsigned char*)demial;
unsigned char map[32];
int count;
for (count =0; count <32; count++){
map[count] = 0;
}
do {
map[*ctrl >> 3] |= (1 << (*ctrl & 7));
} while (*ctrl++);
if (string_org){
str = (unsigned char*)string_org;
} else{
str = last;
}
while ((map[*str >> 3] & (1 << (*str & 7))) && *str){
str++;
}
string_org = (char*)str;
for (;*str; str++){
if ( map[*str >> 3] & (1 << (*str & 7))){
*str++ = '\0';
break;
}
}
last =str;
if (string_org == (char*)str){
return NULL;
}else{
return string_org;
}
}
int main()
{
//char *src = "Xiao Wei !!!";
char src[20] = "Xiao Wei !!!";
char *str = NULL;
str = my_strtok(src," ");
while(str)
{
printf("%s\n",str);
str = my_strtok(NULL," ");
}
return 0;
}
/*
Xiao
Wei
!!!
*/