strcpy的一个问题,还一个问题是关于宏的副作用的
题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))这个样子啊,而且自增的次数不一定的啊。。。
请大侠们讲解
谢谢