把我的答案也放出来,共同学习
// 1. 逆置字符串 reverse_str()
#include <stdio.h>
#include <string.h>
extern inline
void swap_at(char* p, int i, int j) {
if (i != j) {
char tmp = p[i];
p[i] = p[j];
p[j] = tmp;
}
}
void reverse_str(char* str) {
int last_index = strlen(str) - 1;
int mid = last_index / 2;
for(int i = 0; i < mid; i++) {
swap_at(str, i, last_index - i);
}
}
int main() {
char b[] = "hello";
reverse_str(b);
printf("%s\n", b);
return 0;
}
// 题目2:将一个字符串,左边N个字节(比如3个字节)旋转到字符串最右边。
// 比如:"hello world"-->"lo worldhel"。就是将前面3个字符"hel"旋转到了字符串尾部。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#define USE_MEMCPY (1)
void rotate_str(char *p, int n) {
int len = strlen(p);
// 简单检查
assert(n <= len);
assert(n > 0);
#if USE_MEMCPY
// 方法 1: 利用内存复制移动
char* tmp = (char *)malloc(n);
memcpy(tmp, p, n);
memcpy(p, p + n, len - n);
memcpy(p + (len - n), tmp, n);
free(tmp);
#else
// 方法 2: 手动移动
for(int i = 0; i < n; i++) {
char tmp = p[0];
// 向前移一位
for (int j = 1; j < len; j++) {
p[j - 1] = p[j];
}
// 补上原本第一位的内容
p[len - 1] = tmp;
}
#endif
}
int main() {
char b[] = "hello world";
rotate_str(b, 3);
printf("%s\n", b);
return 0;
}
|