目录
strcpy
char * strcpy( char * dst, const char * src );
- strcpy是一种C语言的标准库函数,strcpy把从src地址开始且含有’\0’结束符的字符串复制到以dest开始的地址空间,返回值的类型为char*。
- 返回值:目标串的地址。
char* strcpy(char* des,const char* source) { char* r=des; assert((des != NULL) && (source != NULL)); while((*r++ = *source++)!='\0'); return des; }
strlen
- strlen 是一个函数,它用来计算指定字符串 str 的长度,但不包括结束字符(即 null 字符)
size_t strlen(char const* str);
- 需要特别注意的是,函数 strlen 返回的是一个类型为 size_t 的值.
/*判断一*/ if(strlen(x)>= strlen(y)) { } /*判断二*/ if(strlen(x)- strlen(y)>= 0) //相减返回值是size_t {
- 表面上看,上面的两个判断表达式完全相等,但实际情况并非如此。其中,判断表达式一没什么问题,程序也能够完全按照预想的那样工作;但判断表达式二的结果就不一样了,它将永远是真
- 函数 strlen 的返回结果是 size_t 类型(即无符号整型),而 size_t 类型绝不可能是负的,语句“if(strlen(x)-strlen(y)>=0)”将永远为真。
- 表达式中同时包含了有符号整数和无符号整数,还是有可能产生意想不到的结果
/*判断一*/ if(strlen(x)>= 5) { } /*判断二*/ if(strlen(x)- 5>=0) { }
- 判断表达式二的结果还是永远是真,其原因与上面相同
关键字 sizeof
- 关键字 sizeof 是一个单目运算符,而不是一个函数。与函数 strlen 不同,它的参数可以是数组、指针、类型、对象、函数等,如下面的示例代码所示:
har sArr[] = "ILOVEC"; /*用sizeof求长度*/ printf("sArr的长度=%d\n", sizeof(sArr));
- 相对于函数 strlen,这里的示例代码运行结果为 7(因为它包括结束字符 null)。
- 同时,对 sizeof 而言,因为缓冲区已经用已知字符串进行了初始化,其长度是固定的,所以 sizeof 在编译时计算缓冲区的长度。
- 也正是由于在编译时计算,因此 sizeof 不能用来返回动态分配的内存空间的大小。
memmove
void *memmove(void *dest, const void *src, unsigned int count);
去掉字符串左右两端的空格
- 截取字符串尾部空格
void Rtrim(char *string) { size_t len = 0; if(string == NULL) return; len = strlen(string); while(len > 0 && string[len-1] == ' ') //位置换一下 string[--len] = 0; return; }
- 截取字符串首部空格
void Ltrim(char *string) { size_t len = 0; len = strlen(string); char *p_tmp = string; //不是以空格开头 if( (*p_tmp) != ' ') return; //找第一个不为空格的 while((*p_tmp) != '\0') { if( (*p_tmp) == ' ') p_tmp++; else break; } //全是空格(从上面已经遍历到最后一个,指针仍然指向空格,则字符串全为空) if((*p_tmp) == '\0') { *string = '\0'; return; } //不全是空格(p_tmp2指向字符串头部,两个指针,将p_tmp指向的非空区域拷贝到前面去) //也可以考虑使用memmove(p_tmp2,p_tmp,ncount); ncount可以通过 len - (p_tmp - p_tmp2) 得出 char *p_tmp2 = string; while((*p_tmp) != '\0') { (*p_tmp2) = (*p_tmp); p_tmp++; p_tmp2++; } (*p_tmp2) = '\0'; return; }