首页 > 代码库 > 习题三——C语言笔试题

习题三——C语言笔试题

1.下面的程序片段的输出为?
#include <stdio.h>
#include <string.h>

int main(void)
{
    char str[]="h\t\"\\/\012\00034";
    printf("%d", strlen(str));
}
分析:主要考察的是转义字符和strlen库函数的使用。\t和\"以及\\分别是用\符号表示其后的为转义符,这三个转义符分别为报警符、"和\三个符号;在C程序中使用转义字符\ddd或者\xhh可以方便灵活地表示任意字符。\ddd为斜杠后面跟三位八进制数,该三位八进制数的值即为对应的八进制ASCII码值。\x后面跟两位十六进制数,该两位十六进制数为对应字符的十六进ASCII码值。在题目的程序中str的\000处即会被处理为字符串的结束。所以str代表的有效字符串包含:h、\t、"、\、/、走纸控制符一共六个有效的字符。
答案:6

2.以下代码的输出为?
#include <stdio.h>
#include <string.h>

int main()
{
    int m=4,n=5;
    float a=(float)m/n;
    float b=m/n;

    printf("%.2f, %.2f", a, b);
    return 0;
}
分析:float强制转换的使用方法为:(float)+变量或者(float)+(表达式),所以a的值为4.0/5而b的值为4/5。
答案:0.80, 0.00

3.以下代码的输出为?
#include <stdio.h>

int main()
{
    int x=3, y=(5, 4);

    printf("%d", x*=y+1);
    return 0;
}
分析:都好运算符的规则:取最后一个值。所以y的值为4。自反运算符的规则:变量与后面整个表达式的值进行自反运算。
答案:15

4.以下代码的输出为?
#include <stdio.h>

int main()
{
    printf("%d", (1<<2+3));
    return 0;
}
分析:考察移位运算和基本优先级。<<的运算符优先级低于+运算符,所以结果为1<<5。
答案:32

5.使用typedef定义一个包含10个整数指针的数组类型a。
分析:typedef的使用非常灵活,功能非常强大,相关的知识点也比较难理解,但是一些基本的使用方法还是比较容易掌握的。详细的参见相关的C语言书籍。
答案:typedef int *a[];

6.以下代码的输出为?
#include <stdio.h>

int main()
{
    int a[3][3], (*b)[4];

    b=(int (*)[4])a;
    printf("%d", (&a[1][1]-&b[1][1]));

    return 0;
}
分析:b是一个指向4个int型元素数组的指针,a被强制赋给b。a[1][1]取的是哪个单元很清楚,主要分析b[1][1]取的是哪个单元,根据语法来理解,b[1]这种写法相当于把b强制往上提升为指针数组(现在b的每个单元都是一个数组指针,当然,这个现在有点复杂起来了),所以b[0]里面的值其实就是a,b[1]的值就应该往前指一个单元,然而这个单元是4个int类型的数组,所以b[1]的起始地址已经是b[0]的值加上4*sizeof(int)也等于a+4*sizeof(int),然后在分析b[1][1],这个已经比较简单了,就是再偏移一个单元,所以一共偏移了5个int单元。然而a[1][1]一共偏移了1*3+1=4个int型的单元,所以两个地址相减的结果为1(指针运算)。
答案:1。
顺便补充一下:由于b[1][1]这种强制提升本来就有点牵强了,所以编译器检查不出来越界操作,也就是说假如我们程序中使用b[5][6]这种写法,编译器也不会报错!

7.以下代码段的输出为?
#include <stdio.h>

int main()
{
    unsigned char a[16][16], *ptr;
    int m;

    ptr=(unsigned char *)a;
    for(m=0; m < sizeof(a); m++, ptr++)
    {
        *ptr= m;
    }
    printf("%x", a[1][10]);

    return 0;
}
分析:通过ptr指针为每个数组单元赋值,a[1][10]被赋的值为15+11=26转换为16进制为26/16=1...10即0x1a。
答案:1a

8.已知以下程序中第一处的输出为21,那么后一处的输出为?
#include <stdio.h>

int main()
{
    unsigned int a[5][16], value = http://www.mamicode.com/0x87654321;
    unsigned char *ptr;
    int m;

    ptr = (unsigned char *)&value;
    printf("%x\n", *ptr); //输出为21
    ptr=(unsigned char *)(a);
    for(m=0; m < sizeof(a); m++, ptr++)
    {
        *ptr= m;
    }
    printf("%x\n", a[1][10]);

    return 0;
}
分析:从第一处printf输出为21可以得知该系统为小端系统,然后a[1][10]这个单元被赋的四个值为16*4+10*4=104开始的四个整数,即104被赋值到a[1][10]的最低8bits,105被赋值到a[1][10]的次低8bits...。
答案:6b6a6968

9.以下代码的输出为?
#include <stdio.h>

int main()
{
    int a=1, b=10;

    do
    {
        a ++;
        b -= a;
        b --;
    } while(b>0);
    printf("%d, %d", a, b);

    return 0;
}
答案:4, -2

10.unsigned signed char 所能表示最大数由UCHAR_MAX定义,则以下程序片断运行后,输出的结果是?
printf(“%d, %x”, UCHAR_MAX, UCHAR_MAX)
答案:255, ff

11.以下代码的输出为?
#include <stdio.h>

int main()
{
    char *str = "hello";
    int * p= (int*)str;

    printf("%d, %d", sizeof(str[0]), sizeof(*p));

    return 0;
}
分析:str[0]表示一个字符型单元,*p表示的是一个int型单元。
答案:1, 4

12.宏定义:将整型变量a的第n位清零起始位为第0位,其它位不变。
分析:基本宏定义的考察,记住宏定义是直接替换即可;同时如果是带参数的宏,请一定在替换部分为每个参数加上括号运算符!
答案:# define clear_bit(a, n) (a) = (a) & (~(1<<(n)))

13.以下代码的输出为?
#include <stdio.h>

int main()
{
    int m=0, n=0;

    if(m++>2 || m++<10)
        n++;
    else
        n--;
    printf("%d, %d", m, n);

    return 0;
}
分析:主要考察逻辑或运算符的运算过程,逻辑或||的运算过程为如果前面的条件为真,则不运算后面的条件,如果前面的条件为假则继续判断(执行)后面的条件判断,所以这里m++>2和m++<10都会判断到,也就是都会被执行,所以m++执行了两次。
答案:2, 1

14.当引用库函数memcpy()时,需要包含的头文件是?
答案:#include <string.h>

15.运行C语言编写的程序
dir /B /tmp时,dir的C程序
int main(int argc, char *argv[])
argc的值是?
答案:3,详情参考博文:http://blog.csdn.net/laoniu_c/article/details/39337981

16.补充atoi函数体,该函数的功能是将一个字符串转换完整数值。
#include <stdio.h>

/* atoi: convert s to integer */
int atoi(char s[])
{
    nt n = 0, i = 0;

    while(‘\0‘ != s[i])
        n = n*10 + s[i++] - ‘0‘;

    return n;
}

int main(void)
{
    char s[] = "12345";

    printf("%d\n", atoi(s));
    return 0;
}

17.根据描述完成下面的17~20空。
/ *
* DESCRIPTION
* The strchr() function locates the first occurrence of
* c(converted to a char) in the string pointed to s.
* The terminating null character is considered part of the string;
* therefore if c is ‘\0‘, the functions locate the terminating ‘\0‘.

* RETURN VALUES
* The functions strchr() return a pointer to the located
* character, or NULL if the character does not appear in the string.
*/
#include <stdio.h>

char *(strchr) (const char *s, int c)
{
    const char ch = (char) c;
    const char *sc;

    for (sc = 0; ; ++s)
    {
        if (*s == ch)
            sc = s;
        if (17)
            return ((char *) sc);
    }
}

int main(void)
{
    char s[] = "Hello world.";
    char *p;

    p = strchr(s, ‘l‘);
    printf("%p %p\n", p, &s[2]);

    return 0;
}
答案:‘\0‘==*s || 0!=sc
/ *
* DESCRIPTION
*The strstr() function locates the first occurrence of the
*null-terminated string s2 in the null-terminated string s.

* RETURN VALUES
*if s2 is an empty string, s1 is returned; if s2 occurs nowhere
*in s1, NULL is returned; otherwise a pointer to the first
*character of the first occurrence of s2 is returned.
*/
#include <stdio.h>
#include <string.h>

char *(strstr)(const char *s1, const char *s2)
{
    const char *sc1, *sc2;

    if(18)
        return((char * ) s1);
    for( ; (s1 = strchr(s1, *s2)) != 0; 19)
    {
        for (sc1 = s1, sc2 = s2; ; )
            if (*++sc2 == ‘\0‘)
                return ((char *) s1);
            else if (*++sc1 != *sc2)
                20;
    }
    return(0);
}

int main(void)
{
    char s1[] = "Hello world.";
    char s2[] = "llo";

    printf("%s\n", strstr(s1, s2));

    return 0;
}
答案:18:NULL==s1 || ‘\0‘==s1[0]
19:s1 ++
20:break

习题三——C语言笔试题