给你一个字符串str, 给你一个位置flag,把位置flag后的字串搬到这个字符串的开头
比如str[] = abcdefg 如果flag = 4,那么结果就是 efgabcd.
条件:不允许直接或间接使用任何的额外的变量。
-
#include <stdio.h>
-
-
char str[] = "1234567890";
-
int flag = 5;
-
-
void func (void);
-
-
int main
-
(void) {
-
-
func ();
-
-
str[sizeof (str) - 1] = '\0'; /*字符串总是以NUL结尾*/
-
printf ("%s\n", str);
-
-
puts ("\nPress ENTER to exit...\n");
-
getchar ();
-
-
return 0;
-
}
-
-
void func
-
(void) {
-
-
/*如果没有交换到字符串最后*/
-
if ((sizeof (str) - 1) != (flag + str[sizeof (str) - 1])) {
-
/*利用位操作交换str[i]和str[flag+i]*/
-
/*字符串最后的NUL作计数器i*/
-
str[str[sizeof (str) - 1]] ^= str[flag + str[sizeof (str) - 1]]; /*两个变量进行异或杂交*/
-
str[flag + str[sizeof (str) - 1]] ^= str[str[sizeof (str) - 1]]; /*从杂交体提纯*/
-
str[str[sizeof (str) - 1]] ^= str[flag + str[sizeof (str) - 1]]; /*提纯*/
-
++str[sizeof (str) - 1]; /*自增计数器*/
-
func (); /*递归处理*/
-
} else {
-
return;
-
}
- }