首页
社区
课程
招聘
[讨论]一道C++的题,验你是不是高手
发表于: 2011-3-16 10:29 23188

[讨论]一道C++的题,验你是不是高手

2011-3-16 10:29
23188
收藏
免费 7
支持
分享
最新回复 (43)
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
26
宏展开时, 如果没有遇到 # , 则会继续展开.
2011-3-21 09:13
0
雪    币: 105
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
27
能够说的再清楚点吗?我不是很确定表达的意思。 谢谢啦
2011-3-21 13:43
0
雪    币: 468
活跃值: (340)
能力值: ( 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短,会溢出

这道题,我注明是可以查资料的。要考核的是你查完资料后,能不能说清楚。居然没有一个正解,遗憾。

继续招聘中!!!这两天居然没简历收到
2011-3-21 14:32
0
雪    币: 35
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
29
小Q
2011-3-22 00:29
0
雪    币: 13
活跃值: (10)
能力值: ( 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);
2011-3-22 15:11
0
雪    币: 13
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
31
呃 看了答案发现不但做错了 而且还比blueapplez  多一个参数。。。我还很弱啊
2011-3-22 15:23
0
雪    币: 233
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
32
牛人,实在看不懂
2011-3-23 09:57
0
雪    币: 308
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
33
这明明就是C语言的题。。和C++毛关系都没有。。
2011-3-23 15:00
0
雪    币: 1149
活跃值: (833)
能力值: ( 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)就能得到正确的宏参数.
2011-3-23 17:43
0
雪    币: 49
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
35
涛哥V5 V6
2011-3-23 17:54
0
雪    币: 67
活跃值: (10)
能力值: ( 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. 缓冲区溢出了

//////////////////////////////////////////////////////////
第一题, 考 预处理 #

第三题,没仔细想
2011-4-3 19:41
0
雪    币: 190
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
37
唉,哥想到的居然是 _variant_t 和 _bstr_t
2011-6-11 16:03
0
雪    币: 6
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
38
菜鸟,看不懂啊
2011-7-25 22:41
0
雪    币: 201
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
39
学习了 但是后两题呢
2011-7-31 22:31
0
雪    币: 2
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
40
不懂C++
检测结果:非高手
2011-7-31 22:54
0
雪    币: 132
活跃值: (214)
能力值: ( 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"
2011-8-3 16:52
0
雪    币: 343
活跃值: (40)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
42
41楼的解释很清晰。
2011-8-3 18:35
0
雪    币: 43
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
43
谢谢41楼,学习了
2011-8-3 22:35
0
雪    币: 82
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
44
“第三点:函数不检查dest的长度。如果dest分配的内存比count短,会溢出”
这个说法不对,对dest的长度的检查是无法做到的。既然调用这个函数,就已经默认dest分配的内存大等于count。这属于函数调用约定。同样的,默认dest,source不是空指针,dest地址不在[source, source+count)这个范围内。

strncpy的行为可以用一句话概括:拷贝source字符串的前n个字符到dest,如果source字符串的长度不够n个,则用0填充不足的部分。
2011-8-14 13:44
0
游客
登录 | 注册 方可回帖
返回
//