一、请填写BOOL, float, 指针变量 与“零值”比较的 if 语句。(本题5分)
Please write down the
if statement for BOOL, float, pointer variables and null. (5 marks)
提示:这里“零值”可以是0, 0.0 , FALSE或者“空指针”。例如 int 变量 n 与“零值”比较的 if 语句为:
if
( n == 0 )
if
( n != 0 )
以此类推。
二、描述以下C语言中类型描述的含义:(本题5分)
Describe the meaning of the following C language type: (5 marks)
#define
n 100
A、 int *p ;
B、 int
*p[n] ;
C、 int (*p)[n] ;
D、 int (*p)() ;
E、 int *p();
F、 int **p ;
G、 typedef
int (*P)(char *(*)()) ;
三、以下为Windows NT下的32位C程序,请计算sizeof的值,(本题10分)
Following is the 32-bit Windows NT in C language. Please calculate the
value of sizeof.(10 marks)
char str[] =
“Hello”;
char *p = str;
int n = 10;
请计算:
Please calculate:
sizeof(str) =
sizeof(p)
=
sizeof(n)
=
void
Func(char str[100])
{
请计算:
Please calculate:
sizeof(str) =
}
void *p =
malloc(100);
请计算:
Please calculate:
sizeof(p) =
四、简答题 (每题4分,共20分)
Short answer question
(4 marks for each question, total 20 marks)
1、头文件中的 ifndef/define/endif 干什么用?
What is the
usage of ifndef/define/endif in the
header?
2、#include
<filename.h> 和
#include “filename.h” 有什么区别?
What is the
difference between #include <filename.h> and #include “filename.h”?
3、const 有什么用途?
What is the
usage of const?
4、 变量可以同时具有const和volatile属性吗?为什么?
Variable can
be both const and volatile attributes? Why?
5、请简述以下A、B 两个for循环的优缺点
Please
describe in briefly the advantages and disadvantages of the Loop A and Loop B.
Loop A.:
for (i=0; i<N; i++)
{
if (condition)
{
DoSomething();
}
else
{
DoOtherthing();
}
}
Loop B:
if
(condition)
{
for (i=0; i<N; i++)
{
DoSomething();
}
}
else
{
for (i=0; i<N; i++)
{
DoOtherthing();
}
}
五、有关内存的思考题, 请问运行下面4个Test后有什么结果。(本题20分)
Problem
about memory. What is the result of execute the following 4 Test?
A:
void
GetMemory(char *p)
{
p= (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str, “Hello word”);
printf(str);
}
B:
char
*GetMemory(void)
{
char p[] = “hello world”;
return p;
}
void
Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}
C:
void
GetMemory(char **p, int num)
{
*p = (char *) malloc(num);
}
void
Test(void)
{
char *str = NULL;
GetMemory(&str, 100);
strcpy(str, “hello”);
printf(str);
}
D:
void
Test(void)
{
char *str = (char *) malloc(100);
strcpy(str, “hello”);
free(str);
if (str != NULL)
{
strcpy(str,
“world”);
printf(str);
}
}
六、编写strcpy函数 (本题20分)
Write the function of strcpy (20
marks)
已知strcpy函数的原型是 char
*strcpy(char *strDest, const char *strSrc);
It is known that prototype of function strcpy is char *strcpy(char*strDest,
const char *strSrc);
返回为目标字符串的地址
Return as target string address
其中strDest是目的字符串,strSrc是源字符串。
strDest is the purpose string, strSrc
is the source string.
(1)
不调用任何库函数,请编写函数 strcpy
Write
the function of strcpy without using any library function.
(2) 此函数返回目标字符串的地址,为什么要返回它?
This function returns the address of
target string. Why should it return?
(3)试想一下,strcpy在什么情况下会出现不期望的结果,为什么会这样?请重写一个函数
char * strmove (char *strDest, const char *strSrc),解决这个问题。
Imagine, in what circumstances strcpy
will output an unexpected result, why is it so? Please rewrite a function
char * strmove (char *strDest, const char*strSrc),
solve this question.
七、测试题(本题10分)
Quiz (10 marks)
已知函数atoi,其函数原型是int atoi(char *str)
It is known that prototype of function atoi is int atoi(char*str)
函数用途:
Usage of function:
将字符串转换成一个整数值
将字符串转换成一个整数值
Convert a string into a integer value
输入参数:
输入参数:
Input
parameters;
str 待转换为整型数的字符串
str 待转换为整型数的字符串
str to be converted to a string of
integers
返回值:
返回值:
Return
value:
成功返回转换后的数值,失败则返回0.
成功返回转换后的数值,失败则返回0.
If success, return the converted value. If
fail, return to 0.
请设计出这个函数的测试用例。
Please
design a test case for this function.
----------------------解答-------------------------
一、请填写BOOL , float, 指针变量 与“零值”比较的 if 语句。
提示:这里“零值”可以是0, 0.0 , FALSE或者“空指针”。例如 int 变量 n 与“零值”比较的 if 语句为:
if ( n == 0 )
if ( n != 0 )
以此类推。
答案:
BOOL型变量:
if(!var)
int型变量:
if(var==0)
float型变量:
const float EPSINON = 0.00001;
if ((x >= - EPSINON) && (x <= EPSINON)
指针变量:
if(var==NULL)
注意:浮点型变量并不精确,所以不可将float变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”形式。如果写成if (x == 0.0),则判为错。
比如 float a = 1.0;
a /= 7;
a *= 7;
a -= 1.0; 这时结果就不等于0.0,所以只要精度够了就行
二、描述以下C语言中类型描述的含义:
#define n 100
A、 int *p ; 定义p, p是一个指向int的指针
B、 int *p[n] ; 定义p, p是一个具有n个元素的数组,每个元素的类型是 指向int的指针
C、 int (*p)[n] ; 定义p, p是一个指针,指向一个具有n个元素的数组,数组的每个元素类型为int
D、 int (*p)() ; 定义p, p是一个指针,指向一个函数,这个函数的类型为 返回值为int, 无参数
E、 int *p(); 声明p, p是一个函数, 返回类型为指向int的指针,无参数
F、 int **p ; 定义p, p是一个“指向int型指针”的指针
G、 typedef int (*P)(char *(*)()) ; 定义类型P, P是一个函数指针类型,此类函数的返回类型为int, 参数的类型为函数指针(返回值为指向char的指针, 无参数)
三、以下为Windows NT下的32位C程序,请计算sizeof的值
char str[] = “Hello”;
char *p = str;
int n = 10;
请计算:
sizeof(str) = 6 要注意最后还有一个'\0'
sizeof(p) = 4 32位中所有的指针都是32位的
sizeof(n) = 4 32位中int是32位的
----------------------------------------------------------
void Func(char str[100])
{
请计算:
sizeof(str) = 4 数组作为形参时,会退化成同类型的指针
}
----------------------------------------------------------
void *p = malloc(100);
请计算:
sizeof(p) = 4 32位中所有的指针都是32位的,和malloc没有关系
四、简答题
1、头文件中的 ifndef/define/endif 干什么用?
ifndef 当标识符已经被定义过
define 定义标识符
endif 结束if块
2、#include <filename.h> 和 #include “filename.h” 有什么区别?
使用<>,编译器从标准库路径开始搜索
使用"" 编译器从用户的工作路径开始搜索
3、const 有什么用途?
在c中,const用来修饰变量,说明它是一个只读类型的,不可以对它进行赋值操作
4、 变量可以同时具有const和volatile属性吗?为什么?
可以,比如说键盘的接口数据,它对于pc来说就是既不可赋值,又是易变的
5、请简述以下A、B 两个for循环的优缺点
Loop A: 判断在循环中,执行效率不高,但代码量少
for (i=0; i<N; i++)
{
if (condition)
{
DoSomething();
}
else
{
DoOtherthine();
}
}
Loop B:判断在循环外,执行效率高,但代码量大
if (condition)
{
for (i=0; i<N; i++)
{
DoSomethine();
}
}
else
{
for (i=0; i<N; i++)
{
DoOtherthing();
}
}
五、有关内存的思考题, 请问运行下面4个Test后有什么结果。
A:
void GetMemody(char *p)
{
p= (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str, “Hello word”);
printf(str);
}
GetMemory( char *p )函数的形参为字符串指针,在函数内部修改形参并不能真正的改变传入形参的值,执行完 char *str = NULL; GetMemory( str );后的str仍然为NULL;
p指向的内存没有释放。
B:
char *GetMemory(void)
{
char p[] = “hello world”;
return p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}
p[]数组为函数内的局部自动变量,在函数返回后,指向的内存已经无效。(变量的生存期问题)
C:
void GetMemory2(char **p, int num)
{
*p = (char *) malloc(num);
}
void Test(void)
{
char *str = NULL;
GetMemory(&str, 100);
strcpy(str, “hello”);
printf(str);
}
在GetMemory中执行申请内存及赋值语句 p = (char *) malloc( num );后未判断内存是否申请成功:且最后str指向的内存也没有释放。
D:
void Test(void)
{
char *str = (char *) malloc(100);
strcpy(str, “hello);
free(str);
if (str != NULL)
{
strcpy(str, “world”);
printf(str);
}
}
在执行 char *str = (char *) malloc(100);后未进行内存是否申请成功的判断;另外,在free(str)后未置str为空,导致后面的判断出现错误
六、编写strcpy函数
已知strcpy函数的原型是 char *strcpy(char *strDest, const char *strSrc);
返回为目标字符串的地址
其中strDest是目的字符串,strSrc是源字符串。
(1)不调用任何库函数,请编写函数 strcpy
(2) 此函数返回目标字符串的地址,为什么要返回它?
(3)试想一下,strcpy在什么情况下时会出现不期望的结果,为什么会这样?请重写一个函数
char * strmove (char *strDest, const char *strSrc),解决这个问题。
(1)
char* strcpy(char * dst, const char * src)
{
char * cp = dst;
while( *cp++ = *src++ ); /* Copy src over dst */
return( dst );
}
或
char * strcpy( char *strDest, const char *strSrc )
{
assert( (strDest != NULL) && (strSrc != NULL) );
char *address = strDest;
while( (*strDest++ = * strSrc++) != ‘\0’ );
return address;
}
(2)
这是为了链式操作,即可以串起来写
strcpy(str_c, strcpy(str_b, str_c));
(3)
当src和dst的范围重合时,且dst的开始点位于src之后时,原操作会src被破坏且无限copy直到"死机"的情况出现
char * strmove (char *dst, const char *src)
{
char * cp = dst;
int len;
if (dst <= src) {
while( *cp++ = *src++ );
} else {
len = strlen(src);
src += len;
cp += len;
len++;
while (len--) {
*cp-- = *src--;
}
}
return( dst );
}
七、测试题
已知函数atoi,其函数原型是int atoi(char *str)
函数用途:
将字符串转换成一个整数值
输入参数:
str 待转换为整型数的字符串
返回值:
成功返回转换后的数值,失败则返回0.
函数用途:
将字符串转换成一个整数值
输入参数:
str 待转换为整型数的字符串
返回值:
成功返回转换后的数值,失败则返回0.
请设计出这个函数的测试用例。
参考答案:
(注:预期结果对不对无所谓,主要看设计的输入条件考虑的是否合理和充分)
Str
|
预期结果
|
“1”
|
1
|
“0”
|
0
|
“abc”(或其他非数字字符串)
|
0
|
“1a” (或其他数字和非数字的组合字符串)
|
0
|
“-1”
|
-1
|
“01”
|
1
|
“1\\”
|
0
|
“1\0”
|
1
|
“1\n”
|
1
|
“1.0”
|
1
|
“1234567890”
(或注明较长字符串或int型长的字符串)
|
“123456789012345678901234567890” (或注明返回较长字符串或int型长的字符串)
|
“123456789045677775”(或注明超过int型的字符串)
|
0
|
“”(空字符串)
|
0
|
NULL
|
0
|
八、阅读理解
1. 智能卡定义:有运算能力的,支持多种存储方式,支持ISO7816系列规范的,内嵌芯片的塑料卡片。
2. 使用APDU协议,采用主从方式同CAD通信。
No comments:
Post a Comment