习题三——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 = 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

时间: 2024-10-12 08:40:52

习题三——C语言笔试题的相关文章

华为C语言笔试题集合

①华为笔试题搜集 1.static有什么用途?(请至少说明两种)    1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变.    2) 在模块内(但在函数体外),一个被声明为静态的变量能够被模块内所用函数訪问,但不能被模块外其他函数訪问.它是一个本地的全局变量.    3) 在模块内,一个被声明为静态的函数仅仅可被这一模块内的其他函数调用.那就是,这个函数被限制在声明它的模块的本地范围内使用 2.引用与指针有什么差别?    1) 引用必须被初始化,指针不必.    2)

C语言笔试题精选3---死锁发生必要条件是?

问:以下哪些是死锁发生必要条件? A.相互排斥条件 B.请求和保持 C.不可剥夺 D.循环等待 具体解答: 1.相互排斥使用(资源独占) 一个资源每次仅仅能给一个进程使用 2.不可强占(不可剥夺) 资源申请者不能强行的从资源占有者手中夺取资源,资源仅仅能由占有者自愿释放 3.请求和保持(部分分配,占有申请) 一个进程在申请新的资源的同一时候保持对原有资源的占有(仅仅有这样才是动态申请,动态分配) 4.循环等待 存在一个进程等待队列 {P1 , P2 , - , Pn}, 当中P1等待P2占有的资

c语言笔试题

填空: 1,short int a[10]={123, 456, 789}; sizeof(a)=(       ); short int *p=&a, 则sizeof(p)=(           ): 2,给点整形变量n(32bit),把n的bit5(bit0开始)置1,其他不变:(    ) : 3,int fun(int* x, int *y){……} 则:怎么用函数指针p调用fun? void main() {    int a=1, b=2; (                  

C语言笔试题精选1---求两个数之间较大的数,不使用if、while、switch、for、?:/以及任何比较语句

题目:求两个数a.b之间较大的数,不使用if.while.switch.for.?:/以及任何比较语句 #include <stdio.h> int min(int a, int b) { int d = a - b; int flag = ((unsigned int)d) >> 31; int array[] = {b, a}; return array[flag]; } int main(int argc, char *argv[]) { int i_min, a, b; s

C语言笔试题精选2---int a[10];问下面哪些不可以表示a[1]的地址?

问题:int a[10];问下面哪些不可以表示a[1]的地址? A.a+sizeof(int) B.&a[0] + 1 C.(int*)&a+1 D.(int*)((char*)&a+sizeof(int)) #include <stdio.h> int main() { int a[10] = { 1,2,3,4,5,6,7,8,9,0 }; printf("*******输出地址*******\n"); printf("a[0] = %

【转载】经典10道c/c++语言经典笔试题(含全部所有参考答案)

经典10道c/c++语言经典笔试题(含全部所有参考答案) 1. 下面这段代码的输出是多少(在32位机上). char *p; char *q[20]; char *m[20][20]; int (*n)[10]; struct MyStruct { char dda; double dda1; int type ; }; MyStruct k; printf("%d %d %d %d %d",sizeof(p),sizeof(q),sizeof(m),sizeof(n),sizeof(

2015考研 杭电 计算机学院 复试笔试题第一题 JAVA语言解法

杭电 2015年考研 计算机学院 复试笔试第一题 JAVA解法 import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern; /* 杭电2015年 计算机学院 复试 笔试题第一题 JAVA解答 * author 刘汪洋 QQ 605283073 * 求出:字符串如:"34223abd#34SB-11--" * 中整数的和 其中-在数字前表示负号,否则为字符 */ pub

2018春招-今日头条笔试题-第三题(python)

题目描述:2018春招-今日头条笔试题5题(后附大佬答案-c++版) 解题思路: 本题的做法最重要的应该是如何拼出'1234567890',对于输入表达试获得对应的结果利用python内置函数eval()即可以实现.利用5个字符串来表达'1234567890',如下(为了好看,里面加了tab空格符) '66666 ....6 66666 66666 6...6 66666 66666 66666 66666 66666''6...6 ....6 ....6 ....6 6...6 6.... 6

【转】嵌入式软件工程师经典笔试题

嵌入式软件工程师经典笔试题 > 预处理器(Preprocessor) 1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 我在这想看到几件事情: 1). #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等) 2). 懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中 有多少秒而不是计算出实际的值,是更清晰而没有代价的. 3).