1、Strcat函数原型如下:
- char *strcat(char *strDest, const char *strScr) //将源字符串加const,表明其为输入参数
- {
- char * address = strDest; //该语句若放在assert之后,编译出错
- assert((strDest != NULL) && (strScr != NULL)); //对源地址和目的地址加非0断言
- while(*strDest) //是while(*strDest!=’\0’)的简化形式
- { //若使用while(*strDest++),则会出错,因为++是不受循环
- strDest++; //约束的。所以要在循环体内++;因为要是*strDest最后指
- } //向该字符串的结束标志’\0’。
- while(*strDest++ = *strScr++)
- {
- NULL; //该循环条件内可以用++,
- } //此处可以加语句*strDest=’\0’;有无必要?
- return address; //为了实现链式操作,将目的地址返回
- }
2、Strcpy函数原型如下:
- char *strcpy(char *strDest, const char *strScr)
- {
- char *address=strDest;
- assert((strDest != NULL) && (strScr != NULL));
- while(*strScr) //是while(*strScr != ’\0’)的简化形式;
- {
- *strDest++ = *strScr++;
- }
- *strDest = '\0'; //当strScr字符串长度小于原strDest字符串长度
- return address; //时,如果没有改语句,就会出错了。
- }
3、Strcmp函数原型如下:
- int strcmp (const char *str1,const char *str2)
- {
- int len = 0;
- assert((str1 != '\0') && (str2 != '\0'));
- while(*str1 && *str2 && (*str1 == *str2))
- {
- str1++;
- str2++;
- }
- return *str1-*str2;
- }
4、Strlen函数原型如下:
- int strlen(const char *str)
- {
- int len = 0;
- assert(str != NULL);
- while(*str++)
- {
- len++;
- }
- return len;
- }
5、memcpy函数
函数原型:void *memmove(void *dest, const void *source, size_t count)
返回值说明:返回指向dest的void *指针
参数说明:dest,source分别为目标串和源串的首地址。count为要移动的字符的个数
函数说明:memmove用于从source拷贝count个字符到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。
- void *memcpy(void *dest, const void *source, size_t count)
- {
- assert((NULL != dest) && (NULL != source));
- char *tmp_dest = (char *)dest;
- char *tmp_source = (char *)source;
- while(count --)//不对是否存在重叠区域进行判断
- *tmp_dest ++ = *tmp_source ++;
- return dest;
- }
6、memmove函数
函数原型:void *memcpy(void *dest, const void *source, size_t count);
返回值说明:返回指向dest的void *指针
函数说明:memcpy功能和memmove相同,但是memcpy中dest和source中的区域不能重叠,否则会出现未知结果。
函数memcpy() 从source 指向的区域向dest指向的区域复制count个字符,如果两数组重叠,不定义该函数的行为。而memmove(),如果两函数重叠,赋值仍正确进行。
memcpy函数假设要复制的内存区域不存在重叠,如果你能确保你进行复制操作的的内存区域没有任何重叠,可以直接用memcpy。 如果你不能保证是否有重叠,为了确保复制的正确性,你必须用memmove。
- void *memmove(void *dest, const void *source, size_t count)
- {
- assert((NULL != dest) && (NULL != source));
- char *tmp_source, *tmp_dest;
- tmp_source = (char *)source;
- tmp_dest = (char *)dest;
- if((dest + count<source) || (source + count) <dest))
- {// 如果没有重叠区域
- while(count--)
- *tmp_dest++ = *tmp_source++;
- }
- else
- { //如果有重叠,反向拷贝。以避免源字符串被部分目的字符串覆盖
- tmp_source += count - 1;
- tmp_dest += count - 1;
- while(count--)
- *--tmp_dest = *--tmp;
- }
- return dest;
- }
7.atoi
原型: int atoi(const char *nptr);
函数说明: 参数nptr字符串,如果第一个非空格字符不存在或者不是数字也不是正负号则返回零,否则开始做类型转换,之后检测到非数字(包括结束符 \0) 字符时停止转换,返回整型数。
- #include <stdio.h>
- #include <assert.h>
- static int atoi(const char* str)
- {
- int result = 0;
- int sign = 0;
- assert(str != NULL);
- // proc whitespace characters
- while (*str==' ' || *str=='\t' || *str=='\n')
- ++str;
- // proc sign character
- if (*str=='-')
- {
- sign = 1;
- ++str;
- }
- else if (*str=='+')
- {
- ++str;
- }
- // proc numbers
- while (*str>='0' && *str<='9')
- {
- result = result*10 + *str - '0';
- ++str;
- }
- // return result
- if (sign==1)
- return -result;
- else
- return result;
- }
7. itoa
char *itoa( int value, char *string,int radix);
原型说明:
value:欲转换的数据。
string:目标字符串的地址。
radix:转换后的进制数,可以是10进制、16进制等
- char *itoa(int val, char *buf, unsigned radix)
- {
- char *p;
- char *firstdig;
- char temp;
- unsigned digval;
- p = buf;
- if(val <0)
- {
- *p++ = '-';
- val = (unsigned long)(-(long)val);
- }
- firstdig = p;
- do{
- digval = (unsigned)(val % radix);
- val /= radix;
- if (digval > 9)
- *p++ = (char)(digval - 10 + 'a');
- else
- *p++ = (char)(digval + '0');
- }while(val > 0);
- *p-- = '\0 ';
- do{
- temp = *p;
- *p = *firstdig;
- *firstdig = temp;
- --p;
- ++firstdig;
- }while(firstdig < p);
- return buf;
- }