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;
}
原文地址:https://www.cnblogs.com/lsfv/p/6003702.html