• 【2016.3.21】关于字符串的一点总结


    今天重点学习了一下关于字符串的一些知识点,总结一下如下:

    1.’’的ASCII值为0

    可以利用这个特性判断字符串是否到末尾了。假设有字符数组str[],下面的while()可以判断字符数组是否结束。

    int i = 0;
    while(str[i])
    {
        printf("%c",str[i]);
        i++;
    }

    2.关于strcpy函数

    a).strcpy函数的原型

    char *strcpy(char *strDest,const char *strSrc);

    具体实现如下:

    #include<assert.h>  //包含宏
    
    ...
    
    char *strcpy(char* strDest,const char* strSrc)
    {
        assert((strDest!=NULL)&&(strSrc!=NULL));
        char* temp = strDest;
        while((*strDest++=*strSrc++)!='')
        return temp;
    }

    其中

    while((*strDest++=*strSrc++)!='')

    不太好理解,可以理解为下面两种方式:

    //第一种
    while(1)
    {
        char r;    
        *temp= *strSrc;    
        temp++;   
        strSrc++; 
        r = *strSrc;   
        if( '' == r )
          break;
    }
    //第二种
    while ( *strSrc != '' )
    
    {
    
      *temp++ = *strSrc++;
    
    }
    
    *strDestCopy=‘0’;

    b).void assert(int expression)函数

    这个函数判断expression的值是否为真,如果值为真,则跳过,接着执行下一条语句,如果其值为假,则向stderr打印一条出错消息,然后通过调用abort函数来终止程序。

    c).char strcpy(char strDest,char* strSrc)的()里面已经实现了对源字符串到目标字符串的复制,为什么还要返回char*?

    答:是为了实现链式表达式,返回具体值,就像下面这样:
    int length =strlen(strcpy(strDest,"hello world"));

    d).在使用strcpy()函数时,必须预先为目标字符串分配足够的空间。

    例:下面的程序会出现什么问题?[美国某著名软件公司面试题]

    #include <iostream>
    #include <cstdio>
    int main(void)
    {
        char s[]="123456789";
        char d[]="123";
        strcpy(d,s);
        printf("%s,
    %s",d,s);
        return 0;
    }

    实际运行结果如下:
    这里写图片描述
    可以看到源字符串即便是声明成const还是被截掉了一部分。原因在于目标字符串空间不够。先看一下s[]和d[]的地址是多少。

    #include <iostream>
    #include <cstdio>
    int main(void)
    {
        char s[]="123456789";
        char d[]="123";
        //strcpy(d,s);
    
        printf("address of s: %ld
    ",(long int)&s);
        printf("address of d: %ld
    ",(long int)&d);
    
        return 0;
    }

    运行结果:
    这里写图片描述
    可以看到s的地址是2686694,d的地址是2686690,因此有下图:

    这里写图片描述

    因此,d[]=”123456789”, s[] =”56789789”。输出是遇到即结束输出。

    3.malloc()函数

    malloc函数的原型为:void* malloc(unsigned int size);其作用是在内存的动态存储区中分配一个长度为size的连续空间。参数是一个无符号的整型数,返回值是一个指向所分配的连续存储域的起始地址的指针。如果函数没有成功分配空间,则会返回一个NULL并执行相应的操作。

    free()函数与malloc()配套使用,原型为 void free(void* p)作用是释放p所指的内存区域。

  • 相关阅读:
    LeetCode:12. Roman to Integer (Easy)
    Python:正则表达式—— re 模块
    RAID(冗余硬盘阵列)
    Mac OS下搭建Hadoop + Spark集群
    LeetCode:12. Integer to Roman(Medium)
    js事件中绑定另一事件导致事件多次执行
    ie8以上及非ie8情况下的写法
    javascript闭包
    bootstrap-datetimepicker年视图中endDate设置之后比正常时间提前两个月
    javascript的阻塞机制
  • 原文地址:https://www.cnblogs.com/zhengkang/p/5712420.html
Copyright © 2020-2023  润新知