strcpy的一个问题,还一个问题是关于宏的副作用的

redoffice 2007-11-19 01:56:28
题1:编写一个函数,作用是把一个char组成的字符串循环右移n个。比如原来是“abcdefghi”如果n=2,移位后应该是“hiabcdefgh”
  函数头是这样的:
//pStr是指向以'\0'结尾的字符串的指针
//steps是要求移动的n
#define MAX_LEN 30

void LoopMove ( char * pStr, int steps )
{
 //请填充...
}
  解答:
  正确解答1:
void LoopMove ( char *pStr, int steps )
{
 int n = strlen( pStr ) - steps;
 char tmp[MAX_LEN];
 strcpy ( tmp, pStr + n );
 strcpy ( tmp + steps, pStr);
 *( tmp + strlen ( pStr ) ) = '\0';
 strcpy( pStr, tmp );
/*
char tmp1[MAX_LEN];
strcpy( tmp1, tmp );
*/
}

main()
{
LoopMove("whatshallido", 3 );
}

在所给的正确解答中,strcpy( pStr, tmp );这句在我调试的时候是会出问题的。不知道为什么会出问题?
如果写成注释里的模样的话,则不出问题。这是什么问题呢?是因此参数是常量的问题吗?还是怎么的?


看了好多帖子上都有这个例子,宏的副作用

防止宏的副作用。

  宏定义#define MIN(A,B) ((A) <= (B) ? (A) : (B))对MIN(*p++, b)的作用结果是:

((*p++) <= (b) ? (*p++) : (*p++))

  这个表达式会产生副作用,指针p会作三次++自增操作。

不理解这里宏展开为什么会是这个样子?是所有我看到的帖子都有问题?还是我什么地方没理解?我认为应该是((*p++) <= (b) ? (*p++) : (b))这个样子啊,而且自增的次数不一定的啊。。。
请大侠们讲解
谢谢

...全文
288 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
lenux 2007-11-20
  • 打赏
  • 举报
回复
宏的问题大家不理你说明你的理解是正确的
hai040 2007-11-19
  • 打赏
  • 举报
回复
宏那个应该是贴子错了
ttkk_2007 2007-11-19
  • 打赏
  • 举报
回复
第一个这样不行吗,可以无限循环右移

void LoopMove(char *p, int n)
{
int len = strlen(p);
int realN = n % len;
char *pc = new char[len + 1];
strcpy(pc, p + len - realN);
strncpy(pc + realN, p, len - realN);
*(pc + len) = '\0';
strcpy(p, pc);
delete pc;
}
redoffice 2007-11-19
  • 打赏
  • 举报
回复
还有一个宏的问题啊,大家没看到么?
宏的副作用
lenux 2007-11-19
  • 打赏
  • 举报
回复
LoopMove( "whatshallido ", 3 );

你传入的是一个const的字符串"whatshallido ",但是在你的函数里却试图去修改它!!

char src[MAX_LEN];
strcpy(src, "whatshallido ");
LoopMove( src, 3 );
hai040 2007-11-19
  • 打赏
  • 举报
回复
试一下
char* s = "abc";//const char*->char*,是一个隐患吧,忘了在哪里看到有这个的说明
strcpy(s,"bcd");//这里会出错
正确的做法是
char s[4] = {'\0'};
strcpy(s,"bcd");
strcpy(s,"bdc");
redoffice 2007-11-19
  • 打赏
  • 举报
回复
晕了
谢谢了
redoffice 2007-11-19
  • 打赏
  • 举报
回复
没理解啊,希望详解
qzy6 2007-11-19
  • 打赏
  • 举报
回复
题1: 你的调用语句: LoopMove( "whatshallido", 3 ); 传的第一个参数是一个指向常量串的指针,而你的 strcpy( pStr, tmp ); 试图修改该常量串,所以报错。



hai040 2007-11-19
  • 打赏
  • 举报
回复
函数调用有问题,要传字符串变量进去

64,281

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧