一.strcat、strcpy、strcmp、strlen函数的实现
1
实现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;
}
2
实现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;
}
3
实现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);
}
4
实现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
1
strcpy解析
extern char *strcpy(char *dest,char *src);
1.strcpy只用于字符串的复制。
2.strcpy会复制最后的结束符
3.函数会一直拷贝字符串的内容,直到遇到‘\0’
2
memcpy解析
void *memcpy(void *s1, const void *s2, size_t n);
1.内存复制
2.对复制的内容没有限制
3.将一个大小为n的内存段的值拷贝到另一内存段中
3
strncpy解析
char *strncpy(char *s2, const char *s1, size_t n);
1.该函数用于拷贝count个字符。
2.调用完该函数后一定要加上一句:dst[count] = '/0';因为可能拷贝的n个字符中,没有‘\0’
4
memset解析
void *memset(void *s, int ch, size_t n);
1.将s中前n个字节 用 ch 替换并返回 s。
2.常用作字符串等清零。
END
三.字符串逆序
1
普通逆序
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;
}
2
在不允许分配额外的空间的情况下,完成字符串的逆序
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;
}
3
不允许有变量的逆序
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;
}
4
按单词逆序
给定一个字符串,按单词将该字符串逆序,比如给定"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);
}
5
递归实现反向输出字符串
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++;
}
}
1
实现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;
}
2
实现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;
}
3
实现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);
}
4
实现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
1
strcpy解析
extern char *strcpy(char *dest,char *src);
1.strcpy只用于字符串的复制。
2.strcpy会复制最后的结束符
3.函数会一直拷贝字符串的内容,直到遇到‘\0’
2
memcpy解析
void *memcpy(void *s1, const void *s2, size_t n);
1.内存复制
2.对复制的内容没有限制
3.将一个大小为n的内存段的值拷贝到另一内存段中
3
strncpy解析
char *strncpy(char *s2, const char *s1, size_t n);
1.该函数用于拷贝count个字符。
2.调用完该函数后一定要加上一句:dst[count] = '/0';因为可能拷贝的n个字符中,没有‘\0’
4
memset解析
void *memset(void *s, int ch, size_t n);
1.将s中前n个字节 用 ch 替换并返回 s。
2.常用作字符串等清零。
END
三.字符串逆序
1
普通逆序
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;
}
2
在不允许分配额外的空间的情况下,完成字符串的逆序
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;
}
3
不允许有变量的逆序
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;
}
4
按单词逆序
给定一个字符串,按单词将该字符串逆序,比如给定"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);
}
5
递归实现反向输出字符串
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++;
}
}