美文网首页
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