C语言字符串函数(九)


#pragma mark - 字符串常量
void charPointer()
{
    //(一)字符串常量属于静态存储类,如果一个函数中使用字符串常量,即使多次调用该函数,字符串在整个程序运行过程中保存一份
    char *c1 = "aaa";
    char c2[] = "aaa";
    //"aaa" 引号中内容作为指向该字符串的指针
    printf("%p %p","aaa",&c1);

    char *c3[] = {"abd","deb"};
    printf("%s\n %p\n %c\n","hello","how",*"are you"); //字符串的*取值就是指针地址
    printf("c3[0]==%s c3[0]的第一个字符%c\n",c3[0],*c3[0]); //数组下标的*取值 对应字符串的首字符 等同于 c3[0][0]
    
    
    
    
}




#pragma mark - 字符串函数

int codeForChar()
{
    char *c1 = "asdfghjk";
    char c2[] = "hgfdsa";
    char c3[80] = "ssss";
    char c4[] = "hgfdaa";

    
    //(一)strlen 字符串长度
    size_t t1 = strlen(c1);
    size_t t2 = strlen(c2);
    unsigned int num = 5;
    
    //例:结合strlen改变数组元素值
    int a = changeChar(c2, num);
    
    
    
    //(二)strcat 拼接字符数组,c2拼接到c3后面,c2值不变
    strcat(c3, c2);//c3必须数组长度足够容纳新的元素个数+1
    
    //strncat 拼接字符数组,要先计算c3除 '\0'外最大可容纳长度
    unsigned long avi = (10 - strlen(c1)-1);
    strncat(c3, c2, avi);
    
    
    
    
    //(三)strcmp  字符串值比较,成功返回0,  不相等返回非0值
    int isSame = strcmp(c2, c4);//参数是两个指针

    //strncmp 限定搜索指定范围的字符串匹配
    int isCmpSame = strncmp(c2, c4, 4);//匹配前四个元素

    
    
    
    
    //(四)strcpy 字符串拷贝 第二参数支持字符串 字符指针数组 往第一参数copy赋值
    printf("输入要拷贝字符\n");
    char temp[20] = "Rrrrrreee";
    char *apm = "123456789101";
//    strcpy(&temp[2], apm);
    printf("temp point %p apm point %p",temp,apm);
    printf("temp %s apm  %s",temp,apm);
    /*
     temp point 0x7fff5fbff6e0 apm point 0x100000f28
     temp Rr123456789101 apm  123456789101
     
     */

    //strncpy 较为安全的字符串复制方法,指定最大复制数
    size_t t = strlen(temp);
    strncpy(temp+t, apm, 20-t);
    printf("\n");
    puts(temp);
    printf("end");
    /*
     Rrrrrreee12345678910
     */
    
    
    
    
    //(五)sprintf 拼接自定义字符串元素(可以是多种数据类型)
    char first[k_MAX] = "JASONS";
    char last[k_MAX] = "And Timi";
    char formal[2*k_MAX+12];
    double prize = 3389.22f;
    sprintf(formal, "%s %-10s %lf",first,last,prize);
    puts(formal);
    /*
     JASON And Timi   3389.219971
     */
    
    
    
    //(六)strchr 匹配字符元素是否存在,如果存在返回该字符的首地址指针,如果不存在返回NULL
    char *chr = strchr(first, 'S');
    puts(chr);
    printf("%p",&chr);
    
    
    
    
    
    //(七)strpbrk 依次检验字符串first中的字符,当被检验字符在字符串last中也包含时,则停止检验,并返回该字符位置,空字符null不包括在内。
    //first = "JASON" last = "And Timi"
    char *chr2 =strpbrk(first, last);
    puts(chr2);
    /*
      ASON
     */
    
    
    
    
    //(八)strrchr 搜索字符last最后出现在first的位置,如果不存在返回NULL
    char *chr3 = strrchr(first, 'N');
    puts(chr3);
    /*
      NS
     */
    
    return 0;

}



//更改字符
int changeChar(char *string, unsigned int num)
{
    if (strlen(string)>num)
    {
        *(string+num) = '\0';
    }
    
    return 0;
}


//字符串转大字、标点符号计算

void bigCharAndPun()
{
    
    char norChar[] = "Here is China, I wait for you.....";
    bigChar(norChar);
    puts(norChar);
    int num = punctuation(norChar);
    printf("标点符号个数=%d\n",num);
}


#pragma mark - 字符串转大写 toupper
int bigChar(char *bigC)
{
    
    while (*bigC) {
        *bigC = toupper(*bigC);
        bigC++;
    }
    return 0;
}


#pragma mark - 计算字符串中标点符号个数 ispunct
int punctuation(const char *pun)
{
    int numOfPun = 0;
    while (*pun) {
        
        if (ispunct(*pun))
        {
            numOfPun++;
        }
        pun++;
    }
    
    return numOfPun;
}


//字符串排序

int sortCode()
{
    
    char *a[] ={"jj","abe","cat","timi","done"};

    printf("原来的序列是:\n");
    print(a);
    
    sort(a);
    
    printf("\n排序后的序列是:\n");
    print(a);
    printf("\n\n");
    return 0;
}


#pragma mark - 字符串排序
void sort(char *a[])
{
    int i,j;
    char *temp;
    for(i=0;i<4;i++)//注意是i<4
    {
        for(j=0;j<4;j++)//注意是j<4,因为下面要+1和后面的那个字符串比较
        {
            if(strcmp(a[j],a[j+1])>0)//字符串比较:>0表示前面的字符串比后面的大则交换
            {
                temp=a[j];
                a[j]=a[j+1];
                a[j+1]=temp;
            }
        }
    }
}

void print(char *a[])
{
    int i;
    for(i=0;i<5;i++)
    {
        printf("%s ",a[i]);
    }
    
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值