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

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

2011-3-16 10:29
23284

我来出一道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,调整窗口的大小,会发现窗口高度大到一定值就不能再大了。设法让它更大。


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 7
支持
分享
最新回复 (43)
雪    币: 458
活跃值: (421)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
2
第一题。(本人理解  感觉不太对劲  但想不出来其他的理解方式了)
#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大小
第三题。
。。。
2011-3-16 10:45
0
雪    币: 468
活跃值: (340)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
3
blueapplez的做法不好。虽然你完成了,但你应该知道我想考核什么内容
blueapplez的第二题没理解题意,我要的是“说明它的行为”,你写的是使用注意事项

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

7楼8楼做对了

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

    printf("Japan_EarthQuake is %s", Japan_EarthQuake);
2011-3-16 11:13
0
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
6
我要输出这个内容,并希望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 是什么?
2011-3-16 12:03
0
雪    币: 38
活跃值: (52)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
来吧我来给个正确答案,这也算高手问题??

#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;
}
2011-3-16 12:04
0
雪    币: 445
活跃值: (52)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
#define Japan_EarthQuake 9.0

#define _stringer(x)  #x
#define stringer(x)  _stringer(x)
printf("Japan_EarthQuake is %s",stringer(Japan_EarthQuake));
2011-3-16 12:08
0
雪    币: 34
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
printf("Japan_EarthQuak");
printf("e is 9.0");
2011-3-16 12:11
0
雪    币: 445
活跃值: (52)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
所有宏的参数全部展开!
2011-3-16 12:12
0
雪    币: 90
活跃值: (91)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
我就看看 我不说话
2011-3-16 12:25
0
雪    币: 208
活跃值: (148)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
#define Japan_EarthQuake 9.0

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

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

#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


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

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

最后说一句,我只是打酱油的~~
2011-3-16 13:22
0
雪    币: 458
活跃值: (421)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
16
膜拜 7楼8楼
2011-3-16 13:37
0
雪    币: 220
活跃值: (50)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
出题有点不够严谨...
不过完全没有理解的只能说明思想差距大比较大..  进而说明..  就像我..  看到是C++的题,我还以为考的一定是和C++特有的...  不想竟然是C/C++共有的..  C语言也有单井号和双井号的..
2011-3-16 14:10
0
雪    币: 678
活跃值: (101)
能力值: ( LV2,RANK:150 )
在线值:
发帖
回帖
粉丝
18
strncpy用了长度来对字符串拷贝进行控制,这比起直接用strcpy要好,可以减少缓冲区溢出的可能性。
使得编码变得更加严谨和规范。
2011-3-17 12:54
0
雪    币: 136
活跃值: (48)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
19
这个可以得分
2011-3-17 13:16
0
雪    币: 6
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
同感,感觉题目没说清楚
2011-3-17 13:58
0
雪    币: 270
活跃值: (97)
能力值: ( LV8,RANK:140 )
在线值:
发帖
回帖
粉丝
21
前来观摩和学习各位朋友的解法
2011-3-19 21:02
0
雪    币: 27
活跃值: (127)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
22
前来观摩和学习, 很喜欢看刘总出的题, 每次都能学到一点东西
2011-3-19 21:32
0
雪    币: 270
活跃值: (97)
能力值: ( LV8,RANK:140 )
在线值:
发帖
回帖
粉丝
23
那个宏要用两个定义,这里有点不明白
2011-3-19 21:39
0
雪    币: 233
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
#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来实现.
2011-3-19 22:39
0
雪    币: 105
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
测试了一下,想法之所以这样调用,是因为在展开第一个宏的时候,有时机将define的宏,也就是把Japan_EarthQuake替换成9.0,然后#转换成字符串"9.0"

原来是这样考虑的,怪不得TEXT()会这样定义。学习了
2011-3-20 01:47
0
游客
登录 | 注册 方可回帖
返回
//