C字符串操作函数及sizeof strlen区别

  本文总结记录C语言中字符串操作接口函数的使用及关键字sizeof和strlen操作的区别

字符串结构

定义字符串常量

char *str = "Hello World";   // *str 为指向 .rodata 空间中存放字符 'H' 的地址

该字符串常量在 .rodata 中建立连续的空间来存放字符串,此时该字符串为只读,不可修改
字符串

字符串函数

strcpy 和 strncpy

// 将src指向空间中的字符串,复制到dest指向的空间中,返回dest
char *strcpy(char *dest, const char *src)

// 将src指向空间中的前N个字符,复制到dest指向的空间中,返回dest
char *strncpy(char *dest, const char *src, int N)

strcat 和 strncat

// 将src所指的字符串附加到dest所指字符串的末尾
char *strcat(char *dest, const char *src)

// 将src所指的前N个字符附加到dest所指的字符串末尾
char *strncat(char *dest, const char *src, int N)

strcmp 和 strncmp

int strcmp(char *dest, char *src) 
int strncmp(char *dest, const char *src, int N) 

strcmp 比较两个字符串 dest 和 src 的大小,以 ‘\0’ 结束;
strncmp 只比较两个字符串 dest 和 src 前 N 个字符的大小;
两者返回值如下:
当返回值大于0,说明前面的字符串 dest 大于后面的字符串 src;
当返回值小于0,说明前面的字符串 dest 小于后面的字符串 src;
当返回值等于0,说明前面的字符串 dest 等同于后面的字符串 src;

void fun_Compare() {
    const char *src = "huimingma"; 
    char *dest = (char *)malloc(10);
    scanf("%s",dest);    // 输入huiming
    if(strncmp(dest, src, 7) == 0) {
        printf("输入正确\n");
    }
    else
        printf("输入错误\n");
}

strcasecmp 和 strncasecmp

这两个函数类似于 strcmp 和 strncmp,区别在于比较字符串时忽略大小写

#include <strings.h>
int strcasecmp(const char *s1, const char *s2);
int strncasecmp(const char *s1, const char *s2, size_t n);
void testcasecmp() {
    char *s1 = "ABcd";
    char *s2 = "abCD";
    int ret = strcasecmp(s1, s2);
    printf("return: %d\n", ret);
}

执行打印:return: 0

strchr 和 strrchr

// 在dest指向的字符串中,从第0个元素开始向后找字符c,找到就终止
char *strchr(const char *dest, char c)

// 从最后一个元素开始向前找字符c,找到就终止,并返回该字符的指针,否则返回NULL
char *strrchr(const char *dest, char c) 
void find_Char() {
    const char *dest = "Hello C Code!";
    char *c = strchr(dest, 'o');
    printf("%p:%c\n",c,*c);
    char *c = strrchr(dest, 'o');
    printf("%p:%c\n",c,*c);
}

输出两个字符 o 的地址不一样
输出

strstr 和 strrstr

// 从str1中顺序查找str2所指的字符串
char *strstr(char *str1, const char *str2) 

// 从str1中逆序查找str2所指的字符串
char *strrstr(char *str1, const char *str2) 

返回值为:找到返回子串的首地址,找不到返回 NULL

strtod

// str 为将要进行转换的字符串
// endptr 为 str 中数值后的下一个字符位置
double strtod(const char *str, char **endptr)

返回值为:如果成功转换字符串 str 中的数值,则返回该数值的 double 型,否则返回 0.0

void transform_String() {
    char str[30] = "20.30300 This is test";
    char *ptr = NULL;
    double ret = strtod(str, &ptr); //转换后的剩余子串地址保存到 ptr中
    printf("数字部分是 %lf\n", ret);
    printf("字符串部分是 %s", ptr);
}

atoi 和 atol

// 将str中表示的数字转换成int型的数字
int atoi(const char *str)
// 将str中表示的数字转换成long int型的数字
long atol(const char *str)

返回值为转换后的类型值。

void Transform_Data_Type(char *buf) {
    int inter = atoi(buf);
    long longer = atol(buf);
    printf("%d\n",inter);
    printf("%ld\n",longer);
}

sizeof 与 strlen

sizeof 为 C 语言中的关键字,而 strlen 为求字符串长度的函数

关键字 sizeof

sizeof(普通变量) 返回该变量类型所占的空间大小,int 变量返回 4, char 变量返回 1
sizeof(指针变量) 不管该指针变量为何种类型,返回值都为 4 / 8,因为sizeof返回该变量空间的大小
sizeof(数组变量) 返回整个数组的空间大小,即:数组元素个数 x sizeof(数组类型)

函数 strlen

int strlen(char *str)

通过函数原型可以看出,strlen 传入一个字符串的首地址,返回该字符串的长度,长度不包括最后的 ‘\0’ 空字符。

posted @ 2019-04-10 15:29  Caso_卡索  阅读(136)  评论(0编辑  收藏  举报