首页 > 代码库 > 习题三——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
#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语言笔试题
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。