字符串

  • 目录:
    * 字符串基础知识
    * 字符串指针指向的内存只可读不可写
    * 字符串指针存储的是首地址,输出中文字符需设定中文环境
    * 字符串拷贝strcpy
    * 计算长度函数实现strlen
    * 检索字符串函数strstr
    * 排序函数qsort
    * 比较两个字符串是否相等strcmp
    * 将一个串中的所有字符都设为指定字符strcat
    * 查找字符串s中首次出现字符c的位置strchr(s,c)
    * 宽字符处理

  • 字符串结束必须有\0,不然会出现烫烫烫

    char str[5] = { 'a', 'b', 'c', 'd', '\0' };  
    printf("%s", str);//整体显示必须要有‘\0’ 
    char str1[5] = { 'a', 'b', 'c', 'd', 'e' };//单个显示  
    for (int i = 0; i < 5;i++)  
    {  
        putchar(str1[i]);  
    }  
  • 使用指针移动位置打印出字符串
    ```
    void main5()
    {
    char p = "iloveyou";
    //指针循环输出字符的办法
    p = p + 5;//指针的位置决定从哪里开始
    for (char
    pbegin = p; pbegin != '\0';pbegin++)
    {
    putchar(
    pbegin);
    }

      system("pause");  

    }
    ```

  • 字符串存储在代码区,代码区内容不允许修改
  • char str[100]=“123” 可通过str="abc"改变str内容,因为str在静态区
    ```
    void main()
    {
    char *p = "iloveyou";
    printf("%s", p+1+4);//改变指针的位置输出不同的字符

      p[3] = 'X';//*(P+3) 代码区不允许修改  
      *(p + 4) = 'Y';  
    
    
      system("pause");  

    }
    ```

字符串指针指向的内存只可读不可写
void main3()
{
    char *p = "notepad";
    printf("%d", sizeof(p));
    printf("\n%d", sizeof("notepad"));
    printf("%p", p);

    *p = 'A';//指针指向的这片内存,只读不可写

    //"notepad" 属于代码区的 常量表,符号表
    //3,notepad字符串都在符号表,非字符串变量拷贝到寄存器,
    //字符串就是传递地址  
    system("pause");
}
字符串指针存储的是首地址,输出中文字符需设定中文环境
void main()
{
    char str1[100] = "calc";
    char str2[100] = "calc";
    //char *p
    //str1 == str2;//比较的是指针的值 
    if (strcmp(str1,str2)==0)
    {
        printf("相等");
    } 
    else
    {
        printf("不相等");
    }

    wchar_t strX[100] = L"你好天朝";
    printf("%d", sizeof(strX));

}
计算长度函数实现
unsigned int mystrlen(const char *str)
{
    int length = 0;
    for (int i = 0;;i++)//下标法
    {
    /*  if (*(str+i)=='\0')
        {
            break;
        }*/
        if (str[i] == '\0')
        {
            break;
        }
        length++;

    }
    return length;

}

unsigned int mystrlenaddr(const char *str)
{
    int length = 0;
    for (char *p = str; *p != '\0';p++)//指针法
    {
        length++;
    }
    return length;
}


void main1()
{
    char str[100] = "calc123";
    int length = mystrlenaddr(str);
    printf("%d", length);

    system("pause");
}
检索一个字符中是否包含另一个字符
char *strstrint(const char * _Str, const char * _SubStr)
{
    if (_Str == NULL || _SubStr == NULL)
    {
        return NULL;
    }
    char *pres = NULL;
    int alllength = strlen(_Str);//母串的长度
    int sublength = strlen(_SubStr);//子串的长度

    for (int i = 0; i < alllength - sublength;i++)//获取要前进的尺度
    {
        int flag = 1;//假定相等
        for (int j = 0; j < sublength;j++)
        {
            if (_SubStr[j]!=_Str[i+j])//循环对比
            {
                flag = 0;
                break;
            }

        }
        if (flag)
        {
            pres = _Str + i;//找到的地址
            return pres;
        } 
    }
    return pres;

}

char *strstraddr(const char * _Str, const char * _SubStr)
{
    if (_Str == NULL || _SubStr == NULL)
    {
        return NULL;
    }
    char *pbak = _Str;//备份首地址
    while (*pbak!='\0')
    {
        int flag = 1;//假定相等
        char *pfind = pbak;//从当前字符串循环母串
        char *psub = _SubStr;//从当前字符循环子串
        while (*psub!='\0')
        {

            if (*pfind!='\0')//母串提前结束
            {
                if (*pfind !=*psub)//判断字符不等
                {
                    flag = 0;
                    break;
                } 
                else
                {
                    pfind++;
                    psub++;//往前移动
                }
            } 
            else
            {
                flag = 0;
                break;;
            }
        }
        if (flag)
        {
            return pbak;//保存当前地址
        }

        pbak++;//指针不断向前移动,遍历母串的每一个字符
    }
    return NULL;
}

void main()
{
    char str[100] = "abc124刘海华善于泡妞";
    char name[40] = "124刘海华";
    char *p = strstraddr(str, name);
    if (p!=NULL)
    {
        printf("找到%p,%c",p,*p);
    }
    else
    {
        printf("找不到");
    }
    system("pause");
}
字符串拷贝strcpy
char *  mystrcpy(char *dest, const char *source)
{
    if (dest ==NULL || source==NULL)
    {
        return NULL;
    }
    for (int i = 0;;i++)//下标法
    {
         dest[i] = source[i];//一次搞定
        if (*(source+i)=='\0')
        {
            //dest[i] = source[i];//附加\0
            break;
        }
        //dest[i] = source[i];

    }
    return dest;

}
char *  mystrcpyaddr(char *dest, const char *source)
{
    if (dest == NULL || source == NULL)
    {
        return NULL;
    }
    char *phead = dest;

    //while (*source!='\0')//终止
    //{
    //  *dest = *source;//赋值
    //  dest++;//指针前进
    //  source++;

    //}
    //*dest = *source;//处理\0


    while ( (*dest++=  *source++))//装逼写法
    {

    }

    return phead;

}



void main2()
{
    char str[100];
    char *p = "大熊1231312321";
    ;//字符串拷贝
    printf("%s", mystrcpyaddr(str, p));
    //str = p;

    system("pause");
}
qsort排序函数
void fill(int *a,int n)//填充随机数
{
    time_t ts;
    unsigned int num = time(&ts);
    srand(num);
    for (int i = 0; i < n;i++)
    {
        a[i] = rand() % n;
    }
}

void print(int *a, int n)
{
    for (int i = 0; i < n; i++)
    {
        printf("\n%d", a[i]);//打印
    }

}

int com(const void *p1, const void *p2)
{
    const int *pint1 = p1;//指针的类型转换,
    const int *pint2 = p2;
    //*pint2 = 1;限定权限
    if (*pint1 == *pint2)
    {
        return 0;
    }
    else if (*pint1 < *pint2)
    {
        return 1;
    } 
    else
    {
        return -1;
    }

}


void main()
{
    int a[100];
    fill(a, 100);
    print(a, 100);
    //qsort()
    qsort(a, 100, sizeof(int), com);
    printf("快速排序以后");
    print(a, 100);

    system("pause");
}
比较两个字符串是否相等strcmp
#include <stdio.h>
#include <string.h>
int   mystrcmp( const char * _Str1, const char * _Str2)
{
    if (_Str1==NULL || _Str2==NULL)
    {
        return 0;
    }
    //下标法
    //int i = 0;

    //while (_Str1[i]==_Str2[i]  && _Str1[i]!='\0')//一直循环到相等结束
    //{
    //  i++;
    //}
    //if (_Str1[i] == '\0' && _Str2[i] == '\0')//相等
    //{
    //  return 0;
    //} 
    //else
    //{
    //  //return  _Str1[i] - _Str2[i];
    //  if (_Str1[i] - _Str2[i]>0)//字符相减
    //  {
    //      return 1;
    //  } 
    //  else
    //  {
    //      return -1;
    //  }
    //}
    //指针法
    char *str1 = _Str1;
    char *str2 = _Str2;
    while (*(str1)==*(str2) && *str1!='\0')
    {
        str1++;//一直相等就一直继续
        str2++;

    }
    if (*(str1)=='\0'  && *(str2)=='\0')//结束了
    {
        return 0;
    } 
    else
    {
        if (*(str1)-*(str2) > 0)//字符相减
        {
                    return 1;
        } 
        else
        {
                    return -1;
        }
    }
}
void main()
{
    char str1[100] = "jello wolrd";
    char str2[100] = "jello wolrd";
    //printf("%d", str1 == str2);str1,str2代表常量地址

    printf("\n%d\n", mystrcmp(str1, str2));

    if (mystrcmp(str1, str2) == 0)//判定相等或者不等
    {
        printf("==");
    }
    else
    {
        printf("!=");
    }

    char strX[10][10] = { "calc", "apple", "run", "123", "boat", "dead", "father", "son", "hello", "world" };//二维数组存储是字符串内容

    for (int i = 0; i < 10 - 1; i++) //
    {
        for (int j = 0; j < 10 - 1 - i; j++)
        {
            if (mystrcmp(strX[j], strX[j + 1])>0)
            {
                char strtemp[100] = { 0 };//交换内容
                strcpy(strtemp, strX[j]);
                strcpy(strX[j], strX[j + 1]);
                strcpy(strX[j + 1], strtemp);//字符串可以写入
            }
        }
    }

    for (int i = 0; i < 10; i++)
    {
        printf("\n%s", strX[i]);
    }
    system("pause");
}
将一个串中的所有字符都设为指定字符
#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//函数名: strset
//  功  能 : 将一个串中的所有字符都设为指定字符
//  用  法 : char *strset(char *str, char c);

char *mystrset(char *str, char c)
{
    for (char *pnew = str; *pnew != '\0'; *pnew = c,pnew++)
    {
        ;

    }
}

void *mystrsetdg(char *str, char c)
{
    if (*str=='\0')
    {
        return;
    } 
    else
    {
        *str = c;
        mystrsetdg(++str, c);
    }
}




void main()
{
    char *p = (char[10]){ 0 };
    strcpy(p, "123456");
    printf("%s", p);
    mystrsetdg(p, 'a');
    printf("\n%s", p);

    system("pause");
}
查找字符串s中首次出现字符c的位置strchr(s,c)
#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *mystrchr(const char *str, const char c)
{
    char *p = NULL;
    //for (char *newp = str; *newp != '\0'; newp++)
    //{
    //  if (*newp== c)
    //  {
    //      p = newp;//查找
    //      break;
    //  }
    //}

    for (int i = 0;i<strlen(str);i++)
    {
        if (str[i]==c)
        {
            p = &str[i];//str+i
            break;
        }
    }
    return p;
}

char *mystrchrdg(const char *str, const char c)
{
    if (*str=='\0')
    {
        return NULL;//终止
    } 
    else
    {
        if (*str==c)//判断
        {
            return str;
        } 
        
        mystrchrdg(++str, c);//循环趋于终止
    }

}

void main1111()
{
    char *p = mystrchrdg("calc", 'p');
    if (p==NULL)
    {
        printf("can not find");
    } 
    else
    {
        printf("can  find%p,%c",p,*p);
    }

    system("pause");

}
宽字符处理
#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>

int mywcslen(wchar_t * wstr)
{
    int i = 0;
    while (*wstr !=L'\0')
    {
        i++;
        wstr++;
    }
    return i;
}
void mainh()
{
    setlocale(LC_ALL, "zh-CN");//设定中文
    wchar_t wch[10] = L"我是男神爱女神";
    

    wprintf(L"%ls", wch);

    system("pause");

}

void main()
{
    setlocale(LC_ALL, "zh-CN");//设定中文
    wchar_t wch[10] = L"a男神爱女神12";

    //strlen
    int length = mywcslen(wch);
    printf("%d", length);

    system("pause");
}


void mains()
{
    setlocale(LC_ALL, "zh-CN");//设定中文

    wchar_t wch = L'我';
    putwchar(wch);


    system("pause");
}

void mainp()
{

    wchar_t wch = L'A';
    char ch = 'A';
    printf("%d,%d", ch, wch);

    system("pause");
}
wchar_t *  mywcscpy(wchar_t * dest, const wchar_t * source)
{
    if (dest ==NULL || source ==NULL)
    {
        return NULL;
    }
    else
    {
        wchar_t *p = dest;
        while (*dest++ =*source++)
        {

        }

        return p;

    }
}

void mainty()
{
    setlocale(LC_ALL, "zh-CN");//设定中文
    wchar_t *p = (wchar_t[100]){ 0 };//栈上分配上数组
    wchar_t wch[10] = L"我是男神爱女神";
    mywcscpy(p, wch);

    wprintf(L"%ls", p);

    system("pause");
}


转载于:https://www.cnblogs.com/lhfen/p/6081226.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值