能力值:
( LV15,RANK:670 )
|
-
-
26 楼
宏展开时, 如果没有遇到 # , 则会继续展开.
|
能力值:
( LV2,RANK:10 )
|
-
-
27 楼
能够说的再清楚点吗?我不是很确定表达的意思。 谢谢啦
|
能力值:
( LV9,RANK:170 )
|
-
-
28 楼
公布答案!
宏定义的问题,已经有人做出来了,不再赘述。需要两次define
描述strncpy的行为:
strncpy 的定义是:
char* strncpy(char* dest, const char * source, size_t count);
第一点:如果source串的长度比count长,只复制count长的串,后面不会补串结尾符'\0'
第二点:如果count比source串要长,则长出的部分会全部补0
第三点:函数不检查dest的长度。如果dest分配的内存比count短,会溢出
这道题,我注明是可以查资料的。要考核的是你查完资料后,能不能说清楚。居然没有一个正解,遗憾。
继续招聘中!!!这两天居然没简历收到
|
能力值:
( LV2,RANK:10 )
|
-
-
29 楼
|
能力值:
( LV2,RANK:10 )
|
-
-
30 楼
#define Japan_EarthQuake 9.0
float aaa = Japan_EarthQuake;
char bbb[4] = {0};
sprintf(bbb,"%02.1f",aaa);
printf("Japan_EarthQuake is %s",bbb);
|
能力值:
( LV2,RANK:10 )
|
-
-
31 楼
呃 看了答案发现不但做错了 而且还比blueapplez 多一个参数。。。我还很弱啊
|
能力值:
( LV2,RANK:10 )
|
-
-
32 楼
牛人,实在看不懂
|
能力值:
( LV4,RANK:50 )
|
-
-
33 楼
这明明就是C语言的题。。和C++毛关系都没有。。
|
能力值:
( LV13,RANK:260 )
|
-
-
34 楼
#define TOW (2)
#define MUL(a,b) (a*b)
printf("%d*%d=%d\n", TOW, TOW, MUL(TOW,TOW));
这行的宏会被展开为:
printf("%d*%d=%d\n", (2), (2), ((2)*(2)));
MUL里的参数TOW会被展开为(2).
2, 当有''#''或''##''的时候
#define A (2)
#define STR(s) #s
#define CONS(a,b) int(a##e##b)
printf("int max: %s\n", STR(INT_MAX)); // INT_MAX #include<climits>
这行会被展开为:
printf("int max: %s\n", "INT_MAX");
printf("%s\n", CONS(A, A)); // compile error
这一行则是:
printf("%s\n", int(AeA));
INT_MAX和A都不会再被展开, 然而解决这个问题的方法很简单. 加多一层中间转换宏.
加这层宏的用意是把所有宏的参数在这层里全部展开, 那么在转换宏里的那一个宏(_STR)就能得到正确的宏参数.
|
能力值:
( LV2,RANK:10 )
|
-
-
35 楼
涛哥V5 V6
|
能力值:
( LV2,RANK:10 )
|
-
-
36 楼
char *strncpy(char *dest, const char *src, size_t len);
1. strlen(src) > len
2. strlen(src) <= len
3. dest缓冲区小于len和strlen(src)的较小者
/////////////////////////////////
1. dest一切正常
2. dest字符串结束无 '\0'
3. 缓冲区溢出了
//////////////////////////////////////////////////////////
第一题, 考 预处理 #
第三题,没仔细想
|
能力值:
( LV3,RANK:20 )
|
-
-
37 楼
唉,哥想到的居然是 _variant_t 和 _bstr_t
|
能力值:
( LV2,RANK:10 )
|
-
-
38 楼
菜鸟,看不懂啊
|
能力值:
( LV2,RANK:10 )
|
-
-
39 楼
学习了 但是后两题呢
|
能力值:
( LV2,RANK:10 )
|
-
-
40 楼
不懂C++
检测结果:非高手
|
能力值:
( LV6,RANK:80 )
|
-
-
41 楼
第三题是啥意思?没说清楚就这样了?
第二题应该不算是有固定答案
第一题则是基础,宏嵌套的意义
经常在一些很大的项目中看到这种东西:
#define _macro(x) ????
#define macro(x) _macro(x)
包括微软做的MFC里面也有很多这种形状的代码。
反正是奇怪了很久,
你想啊,第二行就是再转为另外一个宏展开而已。。
那么这样做两层有啥意义吗。。。
示范:
#define A abc
#define B def
#define _SYM2STR(arg) #arg
#define SYM2STR(arg) _SYM2STR(arg)
int main()
{
puts(_SYM2STR(A B));
puts(SYM2STR(A B));
return 0 ;
}
输出:
A B
abc def
这就是差别了!
先来看这句:
#define _SYM2STR(arg) #arg
这个宏是把一个符号转化成字符串。
比如 _SYM2STR(X) 展开后就成了 "X"。
这属于#搞的鬼。
另外还搜集了几个,为了不影响阅读流程,放在最后。
而从上面的结果,可以发现,
_SYM2STR(A B)的展开是字符串"A B",说明A B被当作一个整体了作为arg,
他并没有进一步展开。
而SYM2STR(A B)首先要展开成
_SYM2STR(A B)
这时,A,B继续被展开成abc和def。成为:
_SYM2STR(abc def)
于是再通过#化为字符串就成了:
"abc def"
了。
所以,这样的宏嵌套很有意义。
可以在交给最底层的宏去完成实际功能前,
由一个套在上层的宏帮助把参数中的宏展开。
补#define 的几个特殊定义:
#define A(x) T_##x
#define B(x) #@x
#define C(x) #x
我们假设:x=1,则有:
A(1)------〉T_1
B(1)------〉'1'
C(1)------〉"1"
|
能力值:
( LV5,RANK:60 )
|
-
-
42 楼
41楼的解释很清晰。
|
能力值:
( LV2,RANK:10 )
|
-
-
43 楼
谢谢41楼,学习了
|
能力值:
( LV4,RANK:50 )
|
-
-
44 楼
“第三点:函数不检查dest的长度。如果dest分配的内存比count短,会溢出”
这个说法不对,对dest的长度的检查是无法做到的。既然调用这个函数,就已经默认dest分配的内存大等于count。这属于函数调用约定。同样的,默认dest,source不是空指针,dest地址不在[source, source+count)这个范围内。
strncpy的行为可以用一句话概括:拷贝source字符串的前n个字符到dest,如果source字符串的长度不够n个,则用0填充不足的部分。
|
|
|