华为招聘-C语言笔试试题及答案

来源:互联网 发布:java如何调用一个方法 编辑:程序博客网 时间:2024/04/30 10:52

解答:第一题:是对二维数组初始化问题的考察,初始化结果只是给a[1][0]=2;a[1][1]=3进行了赋值,其他值全都为0;可见二维或多维数组一直都是各公司的考察重点。

           第二题: 后面是括号,那么前面应该就是函数的返回类型了,虽然我对这种形式不熟悉,但这应该是在声明,指针函数。

           第三题:指针式地址就和一般数据一样,但是地址不可以进行比较运算,应该是指针变量吧,而且在任何情况下也是不正确的,如果不是同类型的,比较就没有意义。

答案:6,4,4

解答:首先数组中存放的字符串应该考虑到最后的结束字符‘\o',这样计算sizeof()以字节为单位的时候,就会使(字符数+1)这个结果。

            而这里是一个字符指针,所占4个字节。  

            注意:sizeof()最大的相关性是编译器,32位的只能占4位,不同的编译器所得到的int 等数据类型的结构是不同的。

          

       而这个结果也是 4,在这里的str并不是一个数组名,而是形参指向实参的一个指针。所以sizeof()值为 4.


解答:这个题我也挺模糊的,我不明白它在test函数中调用的函数 getmemory()是什么,难道是和上面的setmemory()对应自己来理解,不明白,但是我知道的是strcpy 这个函数将,后一个字符串,赋值给前一个,所有打印str 就应该是 “hello”。

注意:我在做题的过程中,将这个练习和其他的混在一起了,导致想贴个代码都不方便,下次练习实现时,记得要分开。 习惯从现在养成。

    int arr[]={6,7,8,9,10};
    int *you=arr;
    *(you++)+=123;
    printf("%d,%d\n",*you,*(++you));
    //纳尼,这他妈的也可以啊、等会输出是?从右往左的吗???

输出结果 :8,8
    //证明一下
    int guagua=10;
    printf("%d,%d \n",++guagua,++guagua);
    //通过上面这个输出,就证明了输出是从右往左的,但是又出现的那个问题
    printf("%d,%d \n",(guagua++),(guagua++));
    //不加括号时,结果是10,10 加上后是12,12

    printf("%d \n",guagua);
输出结果:12,11    和 12,12 ,14   如果在第二个输出时不加括号,结果是10,10
    int xixi=10;
    xixi++;
    xixi++;
    printf("%d,%d \n",xixi,(++xixi));//好吧,我基本晕了
    //不知道可不可以这样理解,++x是输出值,而x++中,x才是输出值,

输出结果:13,13

综上所述:这在里主要牵扯的是,运算的优先级问题:++x > printf > x++,并且输出是,运算的顺序是从右往左的。


答案:

int strcmp(char *source,char *dest)
{
    while((*source!='/0')&&(*source==*dest))
    {
        source++;
        dest++;
    }
    return ((*source)-(*dest))?-1:0;   

//注意: 这是一个三目运算  if(表达式==ture) return -1;   else return 0;(而对于这个表达式来说,两个字符相等为0,不等相减结果不为0, 就是ture了。
}

为什么我写的看起来就这么麻烦呢??

int strcmp(char *One,char *Two)
{
    int lenth1,lenth2;
    lenth1=strlen(One);
    lenth2=strlen(Two);
    if(lenth1!=lenth2)
    {
        printf("%d,%d,thay are not same lenth!\n",lenth1,lenth2);
        return -1;
    }
    while(lenth1>0)
    {
        if(*(One)!=*(Two))
        {
            printf("%d,%d,thay are not same lenth!\n",lenth1,lenth2);
            return -1;
        }
        else
        {
            lenth1--;
            One++;
            Two++;
        }
        
    }
    if(lenth1=1) return 0;
}

回文: 字符串的对称 比如:level

答案:

int fun(char *p)
{
    int len=strlen(p)-1;
    char *q=p+len;    //直接可以将另一个指针指向字符串的末尾
    if(!p)  return -1;  //这就是错误?   我去
    while(p<q)
    {
        if((*p++)!=(*q--)) return 0;
    
    }
    return 1;
}

用两个指针分别指向字符串的首尾就可以了,我写的就有点麻烦了:

#include <STDIO.H>
#include <STRING>
int fun(char *p)
{
    int lenth;
    lenth=strlen(p);
    if(lenth%2==0)
    {
        while(lenth/2>0)
        {
            if(*p!=*(p+lenth-1))  return 0;
            else  {
                lenth-=2;
                p++;
            }
        }
        return 1;
    }
    else
    {
        while(lenth/2>1)
        {
            if(*p!=*(p+lenth-1))  return 0;
            else  {
                lenth-=2;
                p++;
            }
        }
        return 1;
    }
}
void main(){
    char *q="abba";
//    printf("please input your char* \n");
//    scanf("%s",q);
//    printf("%s",q);
    int x;
    x=fun(q);
    switch(x)
    {
    case 1:
        printf("yes\n");break;
    case -1:
        printf("wrong\n");break;
    case 0:
        printf("no\n");break;
        
    }
}

        总结一下吧,从华为整个题目的组成来讲,考察的都是C语言的基础知识,和对字符串的处理。不过到底是笔试题,考察的都很基础,而且这好像还是2005年的,算啦,就当是对基础知识的复习吧。