手撕字串操作函式
阿新 • • 發佈:2020-12-23
技術標籤:字串
字串複製函式strcpy
#include<stdio.h>
#include<assert.h>
char* my_strcpy(char* srcString,char* desString)
{
assert((srcString != NULL) && (desString != NULL));
char* addr = desString;
while((*desString++ = *srcString++) != '\0') ;
return addr;
}
int main()
{
char * srcString = "abcdefghijklmnopqrstuvwxyz";
char desString[30];
printf("desString = %s \r\n", my_strcpy(srcString, desString));
}
改進字串複製函式strcpy
#include<stdio.h>
#include<assert.h>
#include<string.h>
char* my_strcpy(char *dest, const char *src) {
if (! dest || !src)
return NULL;
char *d = dest;
int size = strlen(src) + 1;
if ((d > src) && (d < (src + size))) {
d = d + size - 1;
src = src + size - 1;
while (size--) {
*d-- = *src--;
}
} else {
while (size--) {
* d++ = *src++;
}
}
return dest;
}
int main()
{
char desString[30];
char srcString[] = "abcdefghijklmnopqrstuvwxyz";
printf("desString = %s \r\n", my_strcpy(desString, srcString));
printf("desString = %s \r\n", my_strcpy(&(srcString[5]), srcString));
return 0;
}
取字串長度strlen
#include<stdio.h>
#include<assert.h>
int my_strlen(char* String)
{
assert(String != NULL);
int i=0;
while((*String++) != '\0') i++;
return i;
}
int main()
{
char* String = "abcdefghijklmnopqrstuvwxyz";
printf("strlen(String) = %d \r\n", my_strlen(String));
return 0;
}
整數轉字串itoa
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char* my_itoa(int num,char* str,int radix)
{ /*索引表*/
char index[]="0123456789ABCDEF";
unsigned unum;/*中間變數*/
int i=0,j,k;
/*確定unum的值*/
if(radix==10&&num<0)/*十進位制負數*/
{
unum=(unsigned)-num;
str[i++]='-';
}
else unum=(unsigned)num;/*其他情況*/
/*轉換*/
do{
str[i++]=index[unum%(unsigned)radix];
unum/=radix;
}while(unum);
str[i]='\0';
/*逆序*/
if(str[0]=='-')
k=1;/*十進位制負數*/
else
k=0;
for(j=k;j<=(i-1)/2;j++)
{ char temp;
temp=str[j];
str[j]=str[i-1+k-j];
str[i-1+k-j]=temp;
}
return str;
}
int main()
{
char* buf = malloc(50);
memset(buf,0,50);
printf("255 = %s \r\n",my_itoa(255,buf,16));
memset(buf,0,50);
printf("0xFF = %s \r\n",my_itoa(0xFF,buf,10));
free(buf);
return 0;
}
字串轉整數atoi
#include<stdio.h>
long int my_atoi(const char *nptr)
{
int c; /* current char */
long int total; /* current total */
int sign; /* if '-', then negative, otherwise positive */
/* skip whitespace */
while ((*nptr == ' ') || (*nptr == '\r') || (*nptr == '\n') || ( *nptr == '\v') || (*nptr == '\f') || (*nptr == '\t')){
++nptr;
}
c = *nptr++;
sign = c; /* save sign indication */
if (c == '-' || c == '+')
c = *nptr++; /* skip sign */
total = 0;
while ((c >= '0') && (c <= '9')) {
total = 10 * total + (c - '0'); /* accumulate digit */
c = *nptr++; /* get next char */
}
if (sign == '-')
return -total;
else
return total; /* return result, negated if necessary */
}
int main()
{
char buf1[] = "0123456789";
printf("buf1 = %ld \r\n", my_atoi(buf1));
char buf2[] = "-9876543210";
printf("buf2 = %ld \r\n", my_atoi(buf2));
return 0;
}
字串拼接函式strcat
#include<stdio.h>
char* my_strcat(char* strDest, const char* strSrc)
{
char *rem = strDest;
while(*strDest) strDest++;
while(*strSrc != '\0'){
*strDest++ = *strSrc++;
}
*strDest = '\0';
return rem;
}
int main()
{
char desString[] = "hello ";
char srcString[] = "world !\r\n";
printf("%s",my_strcat(desString,srcString));
return 0;
}
字串比較strcmp
#include<stdio.h>
int my_strcmp(const char* str1,const char* str2) {
while((*str1==*str2) && (*str1!='\0')){
str1++;
str2++;
}
return *str1-*str2;
}
int main()
{
char str1[] = "helloa";
char str2[] = "hellob";
printf("return = %d \r\n",my_strcmp(str1,str2)); //return = -1
return 0;
}
在str1中查詢str2,並返回str2在str1中的起始位置後的所有字串 strstr
#include<stdio.h>
#include<assert.h>
char* my_strstr(char *str1, char *str2) {
if (str1 == NULL || str2 == NULL) return NULL;
char *s = str1;
if (*str2 == '\0') {
return NULL; //若str2為空,則直接返回空
}
while (*s != '\0') { //若不為空,則進行查詢
char *s1 = s;
char *s2 = str2;
while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2) {
s1++, s2++;
}
if (*s2 == '\0') {
return s; //若s2先結束
}
if (*s2 != '\0' && *s1 == '\0') {
return NULL; //若s1先結束而s2還沒結束,則返回空
}
s++;
}
return NULL;
}
int main()
{
char str1[] = "hello world !\r\n";
char str2[] = "llo";
printf("%s",my_strstr(str1,str2)); //輸出: llo world !
return 0;
}