C常见笔试题(一)

一.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++;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值