// 在標準庫中,函式不考慮src的'\0'終止字元,始終從src中拷貝count個字元到dst中。
// 建議使用memmove函式代替memcpy
void *memcpy ( void *dst, const void *src, size_t count )
return(ret);
}// 首先考慮源位址與目標位址是否存在重疊部分(目標位址是源位址連續記憶體的一部分),
// 如果有重疊部分從高位址向位址賦值,否則從低位址向高位址賦值。
void *memmove(void *dst, const void *src, size_t count)
}else
}return(ret);
}// 把src中所有字元(包括'\0')拷貝到dst中;
// 如果dst的記憶體長度小於src,會造成dst越界
char *strcpy(char *dst, const char *src)
// 把src中前count個字元拷貝到dst中;count小於sizeof(src)時拷貝後dst末尾要加'\0'
// 通常count是sizeof(dst)-1的值,防止越界拷貝
char *strncpy(char *dst, const char *src, size_t count)
char *start = dst;
while (count && (*start++ = *src++)) /* copy string */
count--;
if (count) // sizeof(dst) 大於 sizeof(src)
while (--count)
*start++ = '\0';
return(dst);
}// src字串連線到dst末尾(注意越界)
char *strcat(char *dst, const char *src)
char* strncat(char *dst, const char *src, size_t count)
char *start = dst;
while (*start)
while (count--)
*start = '\0';
return(dst);
}// 記憶體塊ptr1前count位元組與ptr2前n個位元組比較
// 返回值<0: ptr1 < ptr2
// =0: prt1 == ptr2
// >0: ptr1 > ptr2
int memcmp(const void *ptr1, const void *ptr2, size_t count)
// 遇到第乙個不相等的字元或者count=0時終止
while (--count && *(char *)ptr1 == *(char *)ptr2)
return( *((unsigned char *)ptr1) - *((unsigned char *)ptr2) );
}int strncmp(const char *ptr1, const char *ptr2, size_t count)
while (--count && *ptr1 == *ptr2)
return (*(unsigned char *)ptr1 - *(unsigned char *)ptr2);
}int strcmp(const char *ptr1, const char *ptr2)
return (*(unsigned char *)ptr1 - *(unsigned char *)ptr2);
}// 定位value值第一次在buf中的位置,並返回改位置的指標。
// count指定遍歷buf多少個位元組。
void *memchr(const void *buf, int value, size_t count)
return(count ? (void *)buf : null);
}char *strchr(const char *buf, int character)
//定位value值最後一次在buf中的位置,並返回改位置的指標
char * strrchr(char *str, int character)
//在buf字串中的哪個索引位置第一次出現了keys字串才有的字元
size_t strcspn(const char *buf, const char *keys)
count = 0;
map[0] |= 1; /* null chars not considered */
while (!(map[*str >> 3] & (1 << (*str & 7))))
return(count);
}//在buf字串中的哪個索引位置最後一次出現了keys字串才有的字元
size_t strspn(const char *buf, const char *keys)
if (*str)
return(count);
}return(0);
}// 在buf字串中的哪個索引位置第一次出現了keys字串才有的字元,返回那個位置的指標
char* strpbrk(const char *buf, const char *keys)
while (*str)
return(null);
}// strbuf的某段子字串與sunstring一致,並返回第乙個字元相等位置指標
char *strstr(const char *strbuf, const char *substring)
if (!*s2)
return(cp);
cp++;
}return(null);
}#if 0
// 三種字串分隔方法,每種方法都會修改原字串的完整性
// strtok方法遍歷strbuf;如果strbuf的字元符合delimiters字串中某個分割字元,把該字元置換為'\0',返回字串開始位置的指標。剩下的字串保留在乙個全域性變數中
// 該方法不適合多執行緒操作
char *strtok(char *strbuf, const char *delimiters);
// strtok_s是windows下的方法,作用等同於strtok。但是strtok_s把剩餘字串儲存到subbuf中。
char *strtok_s( char *strbuf, const char *strdelimit, char **subbuf);
// strtok_r是linux下的方法
char *strtok_r(char *strbuf, const char *delim, char **subbuf);
#endif
// 返回字串長度('\0'不會計算在內,區別於sizeof)
size_t strlen(char *str);
C 字串類原始碼
參考了c builder中的ansistring,實現了常用的功能,其它需要的可以自己新增.cesstring.h 類似ansistring 的乙個類,用標準c 編寫,可以用在vc和cb中 ifndef cesstring h define cesstring h include include i...
c語言字串相關
在c語言中,有兩個函式可以在控制台 顯示器 上輸出字串,分別是 在c語言中,有兩個函式可以讓使用者從鍵盤上輸入字串,它們分別是 但是,scanf 和 gets 是有區別的 strcat 是 string catenate 的縮寫,意思是把兩個字串拼接在一起,語法格式為 strcat arraynam...
左旋字串原始碼
include using namespace std void reverse char pbegin,char pend char reversesentence char pdata else if pend pend 0 else return pdata void leftreverse ...