zoukankan      html  css  js  c++  java
  • c 字符串常用函数

    #include <iostream>
    #include <stdio.h>
    #include <vector>
    #include "string.h"
    using namespace std;
    
    
    int main()
    {
        //strlen:一直找到
        char name[15]="hi,linson.";
        cout<<strlen(name)<<endl;
    
        char name2[3]={'h',''};
        cout<<strlen(name2)<<endl;//
    
    
        //strcat:从目的开始替换.一直到原串的
        //发现如果目的串长度不够,居然使用后面的空间.看来必须慎用.
        //src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
        char name3[6]="start";
    //    cout<<&name2<<endl;
    //    strcat(name2,name3);
    //    cout<<name2<<&name2<<endl;
    //
    //    cout<<name<<name2<<name3<<endl;
    
    
    
        //strncat
        //比较安全,可以指定长度.用目的串申请的长度-已经占用的长度,再-1(如果原来最后一位是,并且需要保留)
        strncat(name2,name3,3-strlen(name2)-1);
    
        cout<<name<<":"<<name2<<endl;
    
    
    
        //strcom ,后面第一个个不同的字节的ascii减前面的ascii.这个编译器只返回1,0,-1
         cout<<strcmp(name,name2)<<endl;
    
         //strncom,指定比较长度...为什么这里却返回ascii减前面的ascii?
        cout<<strncmp(name,name2,2)<<endl;
    
    
        //str  从源开始一直到,全部逐个赋值.太危险.
        char des[10]={'h','i','a','c'};//未定义字节用初始化了
        char source[3]={'h','i',''};
        strcpy(des,source);
        cout<<des<<":"<<source<<endl;
    
        //strncpy   指定数量复制.或者碰到
        char des2[10]={'h','i','a','c'};
        char source2[3]={'h','i','b'};
        strncpy(des2,source2,3);
        cout<<des2<<":"<<source2<<endl;
        return 0;
    }

    c++:

    string.find():完全匹配字符串。

    string.find_first_of() .非完全匹配,

    strncpy指定数量复制.或者碰到

    而memcpy是直接看数量.也会copy.

    用string 的时候 如果要从char* 复制一定数据,而且里面不都是字符,也有int 类型等,所以需要,必须 string(char* ,n).一定要制定长度.切记.

    读出来根据string 的size 读.直接cout 是不行的.

    #include <stdio.h>
    #include <string>
    #include <iostream>
    #include <memory>
    #include <memory.h>
    
    using namespace std;
    int main(int argc, char **argv)
    {
        char abc[100]={'a','','a','a','a','a','a'};
        string a=string(abc,5);
        
        string b=string(abc);
        
        for(int i=0;i<a.size();++i)
        {
            cout<<a.size()<<":"<<a[i]<<endl;
        }
        cout<<"***************"<<endl;
        for(int i=0;i<b.size();++i)
        {
            cout<<b.size()<<":"<<b[i]<<endl;
        }
        //so ,string 构造函数不同,理解会有不同。如果想要中途接受的符号,必须制定长度。
        
        string str1=a;
        cout<<"***************"<<endl;
        for(int i=0;i<str1.size();++i)
        {
            cout<<str1.size()<<":"<<str1[i]<<endl;
        }
        //so.在这个编译其中。copy 实现或者是swap,或者根据长度来copy.
        
        
        string str2="abccc";
        cout<<"***************"<<endl;
        for(int i=0;i<str2.size();++i)
        {
            cout<<str2.size()<<":"<<str2[i]<<endl;
        }
        //so,和之前的构造函数一样,没有长度就不会包括,(是首先右边的构造函数再有左边的copy构造函数)
        //右边的构造函数,是string(char*)
        
        string str3=string("abccc",3);
        cout<<"***************"<<endl;
        for(int i=0;i<str3.size();++i)
        {
            cout<<str3.size()<<":"<<str3[i]<<endl;
        }
        
        //yes.有长度是会copy 的。所以最重要的一点就是如果想要完全从char*拿到数据。必须构造的时候指定长度。
        
        string strok1=string("abccc",3);
        string strok2=string("gg",3);
        
        string strok3=strok1+strok2;
        
        cout<<"***************"<<endl;
        for(int i=0;i<strok3.size();++i)
        {
            cout<<strok3.size()<<":"<<strok3[i]<<endl;
        }
        
        //看起来和,配合的还好。
        
        string strerr1="abcefg";
        string strerr2="cc";
        
        string strerr3=strerr1+strerr2;
        
        cout<<"***************"<<endl;
        for(int i=0;i<strerr3.size();++i)
        {
            cout<<strerr3.size()<<":"<<strerr3[i]<<endl;
        }
        //这里出错还是一样的。右边构造没有制定长度。 
        
        
        string strok10=string("abcefg",5);
        string strok11=string("cc",3);
        
        string strok12=strok10+strok11;
        
        cout<<"***************"<<endl;
        for(int i=0;i<strok12.size();++i)
        {
            cout<<strok12.size()<<":"<<strok12[i]<<endl;
        }
        
        //制定了还是ok.
        
        char* mychar=new char[strok12.size()];
        for(int i=0;i<strok12.size();++i)
        {
            mychar[i]=strok12[i];
        }
        
        cout<<strlen(mychar)<<":"<<strok12.size()<<endl;
        //strlen是针对的。又是一个坑。
        
        
        
        //所以,
        //1)只要最初从char*中制定了长度构造。那么string 之间的=和+.都和无关。都会正确运行。
        //2)而从string 到char* .必须多使用一个变量来保存长度。千万不能之拿到指针就结束了。
        //2)唯一要注意的就是string strerr1="abcefg";这种情况,是属于没有指定长度的构造函数。是现有右边的无长度构造,后有右边的引用构造。
        
        return 0;
    }
  • 相关阅读:
    C盘与D盘中间有个恢复分区,导致C盘不能扩展卷解决
    Win下,QT控制台无输出解决
    QT与ECharts交互,绘制曲线图
    博客园好看的自定义主题
    Qt5之控件在初始化时就触发了槽函数的问题解决方案
    使用QCustomPlot,跟随鼠标动态显示线上点的值
    QCustomPlot下setTickLabelType()函数在新版本被移除如何解决
    记一次QT使用QAxWidget打开.html文件调用显示离线百度地图不能缩放,自定义图片不能显示解决方法
    使用QPainter绘制汽车仪表盘,动态显示
    QT下使用百度地图js,发送角度值给js使小车根据角度值调整车头方向
  • 原文地址:https://www.cnblogs.com/lsfv/p/6003702.html
Copyright © 2011-2022 走看看