一.strcat、strcpy、strcmp、strlen函數的實現
-
實現strcat函數
格式:extern char *strcat(char *dest,char *src);
功能:把src所指字符串添加到dest結尾處並添加'\0';
返回:指向dest的指針。
實現:
char *Mystrcat(char*dest,const char*src)
{
char *mydest = dest;
while ('\0' != *dest)
{
dest++;
}
while ('\0' !=(*dest++ = *src++))
{
NULL;
}
return mydest;
}
-
實現strcpy函數
格式:extern char *strcpy(char *dest,char *src);
功能:把src所指由NULL結束的字符串複製到dest所指的數組中。
返回:指向dest的指針。
char *mystrcpy(char *strDest, const char *src);
{
char *mydest = strDest;
while(*strDest++ = *src++);
return mydest;
}
-
實現strcmp函數
原型:extern int strcmp(char *str1,char * str2);
功能:比較字符串s1和s2;
返回:當s1<s2時,返回值<0
當s1=s2時,返回值=0
當s1>s2時,返回值>0。
int mystrcmp(const char*str1,const char*str2)
{
while(*str1++==*str2++)
{
if(*str1=='\0')
return 0;
}
return (*str1-*str2);
}
-
實現strlen函數
原型:extern unsigned int strlen(char *s);
功能:計算字符串s的(unsigned int型)長度;
返回:返回s的長度(請注意是無符號整型),不包括結束符NULL。
int mystrlen(const char *str)
{
int len = 0;
while ('\0' != *str++)
{
len++;
}
return len;
}
OK,這裏補充一種方法,也是筆試常考的題目:不用中間變量,實現strlen
int mystrlen(const char *str)
{
if ('\0' == *str )
{
return 0;
}
return mystrlen(str+1)+1;
}
END
二.strcpy、strncpy、memcpy、memset
-
strcpy解析
extern char *strcpy(char *dest,char *src);
1.strcpy只用於字符串的複製。
2.strcpy會複製最後的結束符
3.函數會一直拷貝字符串的內容,直到遇到‘\0’
-
memcpy解析
void *memcpy(void *s1, const void *s2, size_t n);
1.內存複製
2.對複製的內容沒有限制
3.將一個大小爲n的內存段的值拷貝到另一內存段中
-
strncpy解析
char *strncpy(char *s2, const char *s1, size_t n);
1.該函數用於拷貝count個字符。
2.調用完該函數後一定要加上一句:dst[count] = '/0';因爲可能拷貝的n個字符中,沒有‘\0’
-
memset解析
void *memset(void *s, int ch, size_t n);
1.將s中前n個字節 用 ch 替換並返回 s。
2.常用作字符串等清零。
END
三.字符串逆序
-
普通逆序
char *reverse(char *s)
{
char *q = s;
while (*q)
q++;
q -=1;
char *p = (char *)malloc(sizeof(char)*(q-s+2));
char *r = p;
while (q >= s)
{
*p++ = *q--;
}
*p = '\0';
return r;
}
-
在不允許分配額外的空間的情況下,完成字符串的逆序
char *reverse(char *s)
{
char *p = NULL;
char *q = NULL;
char temp;
p = q = s;
while (*q)
{
q++;
}
q--;
while (p < q)
{
temp = *p;
*p = *q;
*q = temp;
}
return s;
}
-
不允許有變量的逆序
char *reverse(char *s)
{
char *p = NULL;
char *q = NULL;
p = q = s;
while (*q)
{
q++;
}
q--;
while (p < q)
{
*p = *p^*q;
*q = *p ^ *q;
*p = *p ^ *q;
p++;q++;
}
return s;
}
-
按單詞逆序
給定一個字符串,按單詞將該字符串逆序,比如給定"This is a sentence",則輸出是"sentence a is This",爲了簡化問題,字符串中不包含標點符號。
1.按照單詞逆序:"sihT si a ecnetnes"
2.按照句子逆序:"sentence a is This"
void reverseword(char *p,char *q)
{
while (p < q)
{
*p = *p ^ *q;
*q = *p ^ *q;
*p = *p ^ *q;
p++;
q++;
}
return;
}
char *reverse(char *s)
{
char *p = NULL;
char *q = NULL;
p = s;
q = s;
while (*q)
{
if (' ' == *q)
{
reverseword(p,q);
q++;
p = q;
}
else
{
q++;
}
}
reverseword(p,q-1);
reverseword(s,q-1);
}
-
遞歸實現反向輸出字符串
void reverse(char *str)
{
if(*str != '/0')
reverse(str + 1);
printf("%c", *str);
}
END
四.其他常見字符串面試題
-
整數轉換爲字符串,並且不調用itoa
1.整數的每一位加上‘0’轉換爲字符串
2.將字符串翻轉
int main(int argc,char **argv)
{
int num = 12345;
char p[7];
char q[7];
int i = 0;
int j = 0;
while (num)
{
p[i] = num%10+'0';
i++;
num = num/10;
}
p[i]='\0';
i--;
while (i>=0)
{
q[j] = p[i];
j++;
i--;
}
q[j] = '\0';
}
-
字符串轉換爲整數
1.字符串減去‘0’就會隱性轉換爲int
2.再乘以10累加法計算
int main(int argc,char **argv)
{
int i = 0,sum = 0;
char temp[7] = {'1','2','3','4','5','\0'};
while (temp[i])
{
sum = sum*10 + (temp[i]- '0');
i++;
}
}