首页
论坛
课程
招聘
[讨论]一道C++的题,验你是不是高手
2011-3-16 10:29 21353

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

2011-3-16 10:29
21353
我来出一道C++的题,如下,

#define Japan_EarthQuake 9.0

printf("Japan_EarthQuake is %s", ???);

我想你已经明白我的意思了。我要输出这个内容,并希望define改了后,也可以输出正确的值。
不要说把???改为 "9.0", 也不要说把 %s 改掉。
你知道怎么做吗? 允许在 printf 前加其它代码

如果你会做,恭喜你,你已经是高手了!

WinMount继续招聘C++程序员和有志于学习Android开发的年轻人!请把简历发到 support@winmount.com
工作地点:苏州,上海,深圳

我还有两道题,一并发出来,有兴趣的可以试着做一做

*说一下函数 strncpy 的行为,分三条。允许查资料。
*在Win7运行 taptib,调整窗口的大小,会发现窗口高度大到一定值就不能再大了。设法让它更大。

看雪论坛2020激励机制:能力值、活跃值和雪币体系!会员积分、权限和会员发帖、回帖活跃程度关联!

收藏
点赞0
打赏
分享
最新回复 (43)
雪    币: 285
活跃值: 活跃值 (86)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
blueapplez 活跃值 14 2011-3-16 10:45
2
0
第一题。(本人理解  感觉不太对劲  但想不出来其他的理解方式了)
#define Japan_EarthQuake 9.0
	
char szJapan_EarthQuake[MAX_PATH] = {0};
sprintf(szJapan_EarthQuake, "%.1f", Japan_EarthQuake);

printf("Japan_EarthQuake is %s", szJapan_EarthQuake);


第二题(本人理解 未翻阅资料)。
int strncpy(char * OUT strDest,  const char * IN strSrc, int iLength);
1.assert(strDest &&  strSrc);
2.assert(iLength>0);
3.确保 (strSrc, strSrc+iLength) 之间没有NULL  不要比较 lstrlen(strSrc) 和 iLength大小
第三题。
。。。
雪    币: 347
活跃值: 活跃值 (10)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
LiuTaoTao 活跃值 3 2011-3-16 10:52
3
0
blueapplez的做法不好。虽然你完成了,但你应该知道我想考核什么内容
blueapplez的第二题没理解题意,我要的是“说明它的行为”,你写的是使用注意事项

5楼的 nevergone 做得有点意思了,但你改了我的define,这不行的。如果define能改,你直接改成 "9.0"了

7楼8楼做对了

第二题还没人做对."说明strncpy的行为",这句话都没有理解
不是让你写如何调用它,是让你写它干了什么
雪    币: 700
活跃值: 活跃值 (11)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
半道出家 活跃值 2011-3-16 11:12
4
0
考宏操作符?
雪    币: 42
活跃值: 活跃值 (15)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
nevergone 活跃值 3 2011-3-16 11:13
5
0
#define stringer( x ) # x
#define Japan_EarthQuake stringer(9.0)

    printf("Japan_EarthQuake is %s", Japan_EarthQuake);
雪    币: 1475
活跃值: 活跃值 (21)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
cntrump 活跃值 13 2011-3-16 12:03
6
0
我要输出这个内容,并希望define改了后,也可以输出正确的值。


把任意东西转为 string . 其中包括本身就是 string 的。
7 楼 , 8 楼 太强悍了. 无法学习, 只能膜拜.
#if defined(UNICODE) || defined(_UNICODE)
#define  _T(x)      L#x
#define  TEXT(x)  _T(x)
#else
#define  _T(x)     #x
#define  TEXT(x)  _T(x)
#endif


*说一下函数 strncpy 的行为,分三条。允许查资料。

char *strncpy(
   char *strDest,
   const char *strSource,
   size_t count 
);


1.  判断参数合法性。
2.  判断源字符串地址是否对齐于 32 位地址边界, 不对齐则进行调整, 使目标地址对齐于 32 位地址边界。
3.  每次按 dword 进行传递。

小弟孤陋寡闻, 求教 taptib 是什么?
雪    币: 30
活跃值: 活跃值 (14)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
lyricC 活跃值 2011-3-16 12:04
7
0
来吧我来给个正确答案,这也算高手问题??

#define Japan_EarthQuake 9.0

#define _ToStr(x) #x
#define __ToStr(x) _ToStr(x)
#include <stdio.h>

int main(int argc, char **argv)
{

        printf("Japan_EarthQuake is %s", __ToStr(Japan_EarthQuake));
        return 0;
}
雪    币: 441
活跃值: 活跃值 (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
叶xiang 活跃值 2011-3-16 12:08
8
0
#define Japan_EarthQuake 9.0

#define _stringer(x)  #x
#define stringer(x)  _stringer(x)
printf("Japan_EarthQuake is %s",stringer(Japan_EarthQuake));
雪    币: 27
活跃值: 活跃值 (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
mszjk 活跃值 2011-3-16 12:11
9
0
printf("Japan_EarthQuak");
printf("e is 9.0");
雪    币: 441
活跃值: 活跃值 (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
叶xiang 活跃值 2011-3-16 12:12
10
0
所有宏的参数全部展开!
雪    币: 89
活跃值: 活跃值 (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xouou 活跃值 2011-3-16 12:25
11
0
我就看看 我不说话
雪    币: 182
活跃值: 活跃值 (33)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
xdklzy 活跃值 1 2011-3-16 12:54
12
0
#define Japan_EarthQuake 9.0

printf("Japan_EarthQuake is %s", ???);

楼主的意思不清楚,只能在printf前面加代码么?printf 中的 ??? 能替换吗?
雪    币: 193
活跃值: 活跃值 (85)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
yy大雄 活跃值 2011-3-16 12:54
13
0
the same as ls
雪    币: 859
活跃值: 活跃值 (17)
能力值: ( LV11,RANK:180 )
在线值:
发帖
回帖
粉丝
Vsbat 活跃值 4 2011-3-16 12:55
14
0

#include <stdio.h>

int main()
{
  #define _ToStr(x) #x
  #define __ToStr(x) _ToStr(x)
  #define Japan_EarthQuake 9.0
  #define printf(x,y) printf(x,__ToStr(Japan_EarthQuake));
  printf("Japan_EarthQuake is %s", ???);
  return 0 ;
}
// Vsbat


雪    币: 202
活跃值: 活跃值 (10)
能力值: ( LV12,RANK:270 )
在线值:
发帖
回帖
粉丝
QEver 活跃值 5 2011-3-16 13:22
15
0
不明白那个“???”是什么意思,总觉得LiuTaoTao出题不够严谨~~

至于strncpy,在VS的安装目录下可以找到strncpy.asm文件,剩下的就不用多说了吧~~

最后说一句,我只是打酱油的~~
雪    币: 285
活跃值: 活跃值 (86)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
blueapplez 活跃值 14 2011-3-16 13:37
16
0
膜拜 7楼8楼
雪    币: 210
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
dxmer 活跃值 2011-3-16 14:10
17
0
出题有点不够严谨...
不过完全没有理解的只能说明思想差距大比较大..  进而说明..  就像我..  看到是C++的题,我还以为考的一定是和C++特有的...  不想竟然是C/C++共有的..  C语言也有单井号和双井号的..
雪    币: 643
活跃值: 活跃值 (11)
能力值: ( LV2,RANK:150 )
在线值:
发帖
回帖
粉丝
StudyRush 活跃值 3 2011-3-17 12:54
18
0
strncpy用了长度来对字符串拷贝进行控制,这比起直接用strcpy要好,可以减少缓冲区溢出的可能性。
使得编码变得更加严谨和规范。
雪    币: 143
活跃值: 活跃值 (16)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
szjohn 活跃值 1 2011-3-17 13:16
19
0
这个可以得分
雪    币: 6
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
FanTasyXX 活跃值 2011-3-17 13:58
20
0
同感,感觉题目没说清楚
雪    币: 273
活跃值: 活跃值 (18)
能力值: ( LV8,RANK:140 )
在线值:
发帖
回帖
粉丝
代码疯子 活跃值 3 2011-3-19 21:02
21
0
前来观摩和学习各位朋友的解法
雪    币: 0
活跃值: 活跃值 (10)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
tihty 活跃值 2 2011-3-19 21:32
22
0
前来观摩和学习, 很喜欢看刘总出的题, 每次都能学到一点东西
雪    币: 273
活跃值: 活跃值 (18)
能力值: ( LV8,RANK:140 )
在线值:
发帖
回帖
粉丝
代码疯子 活跃值 3 2011-3-19 21:39
23
0
那个宏要用两个定义,这里有点不明白
雪    币: 233
活跃值: 活跃值 (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wangell 活跃值 2011-3-19 22:39
24
0
#define Japan_EarthQuake 9.0

#define tostr(x)              #(x)
#define int_to_str(x)      tostr(x)

printf("Japan_EarthQuake is %s", int_to_str(x));

strncpy   个人理解.
依据strcpy的实现方式,进行字符串赋值,直到遇到0终止.
那么strncpy应该会是在判断是否遇到0之后,加上一句ncurlen>=nlen来实现.
雪    币: 105
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
loongboy 活跃值 2011-3-20 01:47
25
0
测试了一下,想法之所以这样调用,是因为在展开第一个宏的时候,有时机将define的宏,也就是把Japan_EarthQuake替换成9.0,然后#转换成字符串"9.0"

原来是这样考虑的,怪不得TEXT()会这样定义。学习了
雪    币: 1475
活跃值: 活跃值 (21)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
cntrump 活跃值 13 2011-3-21 09:13
26
0
宏展开时, 如果没有遇到 # , 则会继续展开.
雪    币: 105
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
loongboy 活跃值 2011-3-21 13:43
27
0
能够说的再清楚点吗?我不是很确定表达的意思。 谢谢啦
雪    币: 347
活跃值: 活跃值 (10)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
LiuTaoTao 活跃值 3 2011-3-21 14:32
28
0
公布答案!
宏定义的问题,已经有人做出来了,不再赘述。需要两次define
描述strncpy的行为:
strncpy 的定义是:
char* strncpy(char* dest, const char * source, size_t count);
第一点:如果source串的长度比count长,只复制count长的串,后面不会补串结尾符'\0'
第二点:如果count比source串要长,则长出的部分会全部补0
第三点:函数不检查dest的长度。如果dest分配的内存比count短,会溢出

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

继续招聘中!!!这两天居然没简历收到
雪    币: 35
活跃值: 活跃值 (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Justzhl 活跃值 2011-3-22 00:29
29
0
小Q
雪    币: 13
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
刹风 活跃值 2011-3-22 15:11
30
0
#define Japan_EarthQuake 9.0
        float aaa = Japan_EarthQuake;
        char bbb[4] = {0};
        sprintf(bbb,"%02.1f",aaa);
        printf("Japan_EarthQuake is %s",bbb);
雪    币: 13
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
刹风 活跃值 2011-3-22 15:23
31
0
呃 看了答案发现不但做错了 而且还比blueapplez  多一个参数。。。我还很弱啊
雪    币: 233
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lijianhai 活跃值 2011-3-23 09:57
32
0
牛人,实在看不懂
雪    币: 303
活跃值: 活跃值 (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
痞子辉 活跃值 1 2011-3-23 15:00
33
0
这明明就是C语言的题。。和C++毛关系都没有。。
雪    币: 1162
活跃值: 活跃值 (47)
能力值: ( LV13,RANK:260 )
在线值:
发帖
回帖
粉丝
ycmint 活跃值 5 2011-3-23 17:43
34
0
#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)就能得到正确的宏参数.
雪    币: 49
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kkkZ 活跃值 2011-3-23 17:54
35
0
涛哥V5 V6
雪    币: 67
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lxzl 活跃值 2011-4-3 19:41
36
0
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. 缓冲区溢出了

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

第三题,没仔细想
雪    币: 184
活跃值: 活跃值 (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
霹雳狂风 活跃值 2011-6-11 16:03
37
0
唉,哥想到的居然是 _variant_t 和 _bstr_t
雪    币: 6
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
千年之雪 活跃值 2011-7-25 22:41
38
0
菜鸟,看不懂啊
雪    币: 201
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
善良屠夫 活跃值 2011-7-31 22:31
39
0
学习了 但是后两题呢
雪    币: 2
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
下一页 活跃值 2011-7-31 22:54
40
0
不懂C++
检测结果:非高手
雪    币: 96
活跃值: 活跃值 (10)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
yiruirui 活跃值 1 2011-8-3 16:52
41
0
第三题是啥意思?没说清楚就这样了?
第二题应该不算是有固定答案
第一题则是基础,宏嵌套的意义
经常在一些很大的项目中看到这种东西:
#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)
于是再