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’ 空字符。
所有博客均在CSDN首发 Caso_卡索 https://blog.csdn.net/xiaoma_2018