嵌入式工程师面试题——常见字符串编程小题目

  1. 写一个程序,从键盘输入字符,然后对字符进行逆序操作
//采用递归的方法实现
void myprint(char ch)
{
    if((ch = getchar()) != '#')
    {
        myprint(ch);
        printf("%c",ch);
    }

}
int main()
{
    char ch;
    ch = getchar();//在终端输入字符,以'#'结尾
    myprint(ch);
    printf("%c",ch);
    return 0;
}

2.字符串转为整型

int str2int(const char *str)
{
    int res,i;
    int bpositive=0;
    res = i =0;
    if('-' == str[0])//判断字符串是否带有负号
    {
        bpositive = -1;
        ++i;
    }
    while(str[i] != '\0')
    {
        res = (res << 1) + (res << 3);//这里进行res = res * 2 + res *8 得到的就是res *=10,或者直接写为res *= 10;
        res += str[i++] - '0';
    }
    if(bpositive)
        res = -res;
    return res;
}
int main()
{
    char p[20];
    scanf("%s",p);
    printf("num = %d\n",str2int(p));
    return 0;
}

3.将整型转化为字符串

void int2str(int num,char *p)
{
    int i = 0,j = 0,k;
    int tmp = num;
    if(num < 0)
    {
        p[j++] = '-';//字符串第一个字符为负号
        tmp = -tmp;//如果是负数,变为整数来处理
    }
    while(tmp)
    {
        //因为不知道是多少位的数,因此从个位开始存起,tmp为零时就存完了,但是这样做个位在前面,所以下面还有逆序输出
        p[j++] = tmp %10 +'0';//取出tmp的个位,赋给p[j]
        tmp /= 10;//去掉个位
    }
    p[j] = '\0';//在末尾加上'\0',形成字符串

    k = num <= 0 ? 1 : 0;//根据num的正负,k取值不同,负数时p[0]为-号,不用处理
    //逆序(高低换位)
    for(i = k ,j = strlen(p)-1;i <= (strlen(p)-1)/2;i++,j--)
        {
            tmp = p[i];
            p[i] = p[j];
            p[j] = tmp;
        }
}

4.实现自己的String函数:strcpy,strlen,strcat,strcmp,memcpy

//strcpy
char * MyStrcpy(char * dest,const char *src)
{
    //先要进行判断指针是否为空
    if(NULL == dest || NULL == src)
        return NULL;
    char *dest_tmp = dest;//用于返回,否则拷贝完后,指向第一个字符的指针就丢失了
    while((*dest++ = *src++)!= '\0');
    return dest_tmp;
}
int MyStrlen(const char *str)
{
    int i = 0,len = 0;
    if(NULL == str)
        return -1;
    while(str[i++] != '\0')
    {
        len++;
    }
    return len;

}

char *MyStrcat( char* str1,const char* str2)
{
    if(str1)
    {
        char *p = str1;
        while(*p != '\0')//使得p指向str1字符串中最后一个字符'\0'while(*p++ !='0')这样是不行的,p会执行'\0'后面一个字符
        {
            ++p;
        }
        MyStrcpy(p,str2);//这里直接调用自己写的strcpy,当然也可以不调用,直接复制MyStrcpy的代码
        return str1;
    }
    return NULL;
}

int MyStrcmp(const char* str1,const char* str2)
{
    while(*str1 != '\0' && *str2 != '\0')
    {
        if(*str1++ != *str2++)
            break;
    }
    return (*--str1 - *--str2);
}

void *Mymemcpy(void *dest, const void *src, size_t n)
{
    char *dest_tmp = dest;
    const char *sre_tmp = src;
    //先要进行判断指针是否为空
    if(NULL == dest_tmp || NULL == sre_tmp || n < 0)
        return NULL;
    while(n--)
    {
        *dest_tmp++ = *sre_tmp++;
    }
    return dest;
}
//测试
int main()
{
    char str1[20] = "hello world!";
    char str2[20] ={0};
    char str3[20] = "c program!";
    char str4[20] = "c program!";
    //MyStrcpy
    printf("str2 = %s\n",MyStrcpy(str2,str1));
    //MyStrlen
    printf("str1_len = %d\n",MyStrlen(str1));
    //MyStrcat
    printf("MyStrcat of str1:%s\n",MyStrcat(str1,str3));
    //MyStrcmp
    if(!MyStrcmp(str3,str4))
        printf("str3 == str4\n");
    if(!MyStrcmp(str1,str4))
        printf("str1 == str4\n");
    else
        printf("str1 != str4\n");

    //Mymemcpy
    printf("str1 = %s\n",str1);
    printf("after Mymemcpy->str1 = %s\n",(char *)Mymemcpy(str3,str1,12));
    return 0;
}

你可能感兴趣的:(C语言,面试)