美文网首页
C学习:06-string

C学习:06-string

作者: 放纵的卡尔 | 来源:发表于2019-04-17 02:12 被阅读0次
    
    #include "../include/StringPart.h"
    
    /**
     * K1:===============================================================
     * 字符串就是以'\0'结尾的字符数组; "HelloWorld" 自带'\0'的结尾.
     * 如果没有以'\0'结尾,则会一直寻找'\0'结尾为止!
     */
    void desc_string(void) {
    
        char arr1[] = {'h', 'e', 'l', 'l', 'o', '\0'};
        printf("arr1 ,%s\n", arr1);
        char arr2[] = {'h', 'e', 'l', 'l', 'o'};
        printf("arr2 ,%s\n", arr2);              //输出结果是不对的.
    
    }
    
    /**
     * K2:===============================================================
     *  char str1[] = "HelloWorld!";栈上的char[]
        char *str2 = "HelloWorld!";常量池的[],不能修改.这两个地址不同.
     */
    void desc_const_string(void) {
        char str1[] = "HelloWorld!";
        char *str2 = "HelloWorld!";
        printf("stack--String--%d\n", str1);
        printf("const--String--%d\n", str2);
    }
    
    
    /**
     * K3:===============================================================
     * char str1[] = "Hello"; 默认自带'\0',长多一个.
     * strlen(char *)  //计算指定指定字符串s的长度,不包含字符串结束符‘\0’  遇到'\0'截断
     * 只要是" "结构的就是字符串,结尾肯定包含'\0',无论中间有无'\0'
     * 因为是针对字符串, 所有的规则都是'\0' 字符串结束!
     */
    void desc_string_size() {
        char str1[] = "Hello";
        char str2[] = {'H', 'e', 'l', 'l', 'o'};
        char str3[] = "hello\0world";
        int str_length = strlen(str1);
        cout << "size_of_str:    " << sizeof(str1) << endl;         //6
        cout << "size_of_str:    " << sizeof(str2) << endl;         //5
        cout << "size_of_str:    " << sizeof(str3) << endl;         //12
        cout << "size_of_str:    " << str_length << endl;           //5
        cout << "size_of_str:    " << strlen(str2) << endl;         // 不确定的数值; 自动找到'\0'结束
        cout << "size_of_str:    " << strlen(str3) << endl;         //5
    
    }
    
    
    /**
     * K4:===============================================================
     * 成功:返回dest字符串的首地址
     * 失败:NULL
     *
     * 默认拷贝 strcopy ----char *strcpy(char *dest, const char *src);
     *  ------越界则会导致崩溃;我测试的是不会崩溃;
     * 有限拷贝 strncopy----char *strncpy(char *dest, const char *src, size_t n);
     *  ------有限拷贝不会将\0拷贝到目标字符串中
     */
    void string_part_test_copy() {
        char dest[5] = {1};
        char dest2[100] = {1};
        char *src = "HelloWorld!";
    
    #if 0
        strcpy(dest, src);
        char *p1 = strcpy(dest, src);
        if (p1!=NULL){
            printf(" string_part_test_copy():  %s", dest);//默认追加'\0'(不是很确定,也要看数组大小是否满足)
            printf(" string_part_test_copy(): end");
        } else{
            cout<<" string_part_test_copy():  fail"<<endl;
        }
    #else
        char *p2 = strncpy(dest2, src, 2);
        if (p2 != NULL) {
            printf(" string_part_test_copy():  %s", dest2);//默认追加'\0'(不是很确定,也要看数组大小是否满足)
            printf(" string_part_test_copy():  end");
        } else {
            cout << " string_part_test_copy():  fail" << endl;
        }
    #endif
    }
    
    
    /**
     * K5:===============================================================
     * 成功:返回dest字符串的首地址  理论上都应该追加'\0',但是要看数组能否装得下.(越界也没崩溃!)
     * 失败:NULL
     * 默认追加:    char *strcat(char *dest, const char *src);
     * 有限追加:    char *strncat(char *dest, const char *src, size_t n);
     */
    void string_part_test_cat() {
    
        char dest[100] = "HelloWorld!";
        char *src = "Nice to Meet U!";
    #if 0
        char *p1 = strcat(dest, src);
        if (p1 != NULL) {
            cout << "string_part_test_cat:    " << dest << endl;
        } else {
            cout << "string_part_test_cat:   fail" << endl;
        }
    #else
    
        char *p2 = strncat(dest, src, 5);
        if (p2 != NULL) {
            cout << "string_part_test_ncat:    " << dest << endl;
        } else {
            cout << "string_part_test_ncat:   fail" << endl;
        }
    
    #endif
    }
    
    
    /**
     * K6:===============================================================
     * 相等:0     大于:>0   小于:<0
     * int strcmp(const char *s1, const char *s2);  比较s1和s2是否相同,比较的是字符ASCII码大小。
     */
    void string_part_test_compare() {
    
        char *p1 = "hello1";
        char *p2 = "1hello";
        int num = strcmp(p1, p2);
        int num2 = strncmp(p1, p2, 1);
        cout << "void string_part_test_cmp    :   " << num << endl;//-1  不相同,就算字符一样也不一致!
        cout << "void string_part_test_cmp    :   " << num2 << endl;//-1  不相同,就算字符一样也不一致!
    }
    
    
    /**
     * K7:===============================================================
     *
     * 追加数字
     *
     * int sprintf(char *_CRT_SECURE_NO_WARNINGS, const char *format, ...);
     * 功能:根据参数format字符串来转换并格式化数据,然后将结果输出到str指定的空间中,直到出现字符串结束符 '\0'  为止。
     * 参数:
     *  str:字符串首地址
     *  format:字符串格式,用法和printf()一样
     * 返回值:
     *  成功:实际格式化的字符个数
     *  失败: - 1
     */
    void string_part_test_sprintf() {
        char dest[20] = {0};
        char *src = "HelloWorld!";
        char test[20] = "HelloWorld!";
        sprintf(test, "%s%d", src, 5);
        cout << test << endl;
    }
    
    
    
    /**
     * K8:===============================================================
     *
     * 主要用于格式化字符串,类似于正则的处理.
     *
     * int sscanf(const char *str, const char *format, ...);
     * 功能:从str指定的字符串读取数据,并根据参数format字符串来转换并格式化数据。
     * 参数:
     *      str:指定的字符串首地址
     *      format:字符串格式,用法和scanf()一样
     * 返回值:
     *      成功:参数数目,成功转换的值的个数
     *      失败: - 1
     *
     */
    void string_part_test_sscanf(){
        char src[] = "a=10, b=20";
        int a;
        int b;
        sscanf(src, "a=%d,  b=%d", &a, &b);
        printf("a:%d, b:%d\n", a, b);
    }
    
    
    
    /**
     * K9:===============================================================
     *char *strchr(const char *s, int c);
     *
     * 功能:在字符串s中查找字母c出现的位置
     * 参数:
     *      s:字符串首地址
     *      c:匹配字母(字符)
     * 返回值:
     *      成功:返回第一次出现的c地址
     *      失败:NULL
     *
     */
    void string_part_test_strchr(){
    
        char src[] = "ddda123abcd";
        char *p = strchr(src, 'a');
        printf("p = %s\n", p);
    
    
    }
    /**
     * K10:===============================================================
     * char *strstr(const char *haystack, const char *needle);
     * 功能:在字符串haystack中查找字符串needle出现的位置
     * 参数:
     *      haystack:源字符串首地址
     *      needle:匹配字符串首地址
     * 返回值:
     *      成功:返回第一次出现的needle地址
     *      失败:NULL
     */
    void string_part_test_strstr(){
    
        char src[] = "ddddabcd123abcd333abcd";
        char *p = strstr(src, "abcd");
        printf("p = %s\n", p);
    
    }
    
    /**
     * K11:===============================================================
     * char *strtok(char *str, const char *delim);
     * 功能:来将字符串分割成一个个片段。当strtok()在参数s的字符串中发现参数delim中包含的分割字符时,
     *      则会将该字符改为\0 字符,当连续出现多个时只替换第一个为\0。
     *      在第一次调用时:strtok()必需给予参数s字符串
     *      往后的调用则将参数s设置成NULL,每次调用成功则返回指向被分割出片段的指针
     * 参数:
     *      str:指向欲分割的字符串
     *      delim:为分割字符串中包含的所有字符
     * 返回值:
     *      成功:分割后字符串首地址
     *      失败:NULL
     */
    void string_part_test_strtok(){
    
        char a[100] = "adc*fvcv*ebcy*hghbdfg*casdert";
        char *s = strtok(a, "*");//将"*"分割的子串取出
        while (s != NULL)
        {
            printf("%s\n", s);
            s = strtok(NULL, "*");
        }
    
    }
    
    
    /**
     * K12:===============================================================
     * int atoi(const char *nptr);
     * 功能:
     *      atoi()会扫描nptr字符串,跳过前面的空格字符,直到遇到数字或正负号才开始做转换,而遇到非数字或字符串结束符('\0')才结束转换,并将结果返回返回值。
     *      atof():把一个小数形式的字符串转化为一个浮点数。
     *      atol():将一个字符串转化为long类型
     * 参数:
     *      nptr:待转换的字符串
     * 返回值:
     *      成功转换后整数
     *
     */
    void string_part_test_stratoNum(){
    
        char str1[] = "-10";
        int num1 = atoi(str1);
        printf("num1 = %d\n", num1);
    
        char str2[] = "0.123";
        double num2 = atof(str2);
        printf("num2 = %lf\n", num2);
    
    }
    
    
    
    
    

    相关文章

      网友评论

          本文标题:C学习:06-string

          本文链接:https://www.haomeiwen.com/subject/uubwwqtx.html