#include <assert.h>
负责旋转字符串函数
void leftmove(char* left,char* right)
{
assert(right != NULL);
assert(left != NULL);
while(left < right)
{
char tmp =*left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
负责调用旋转,ab cdefg 先旋转ab再旋转cdefg再总体旋转。有些范围还是要细心一点
void cmd(char* arr, int k)
{
assert(arr);
int len = strlen(arr);
assert(k < len);
leftmove(arr, arr + k - 1);
leftmove(arr + k, arr + len - 1);
leftmove(arr, arr + len - 1);
}
字符串有多少个字母就有多少种可能性
一一列举出来和第二个数组比较,判断是否为第一个字符串逆序得来
int left_move(char* p1, char* p2)
{
int len = strlen(p1);
int i = 0;
for (i = 0; i < len - 1; ++i)
{
cmd(p1,1);
int ret = strcmp(p1, p2);
if (ret == 0)
return 1;
}
return 0;
}
int main()
{
char arr[] = "abcdefg";
char ff[] = "cdefgab";
int ret = 0;
ret = left_move(arr, ff);
if (ret == 1)
printf("tes\n");
else
printf("no\n");
return 0;
}
不使用临时变量求字符串长度
计数器,指针地址相减,都要用到临时产量
int my_strlen(char* p1)//不使用临时变量求字符串长度
{
if(!(*p1))
return 0;
return 1 + my_strlen(p1+1);
}
没想到一个递归就搞定了☺
练习的复制函数
char* my_strncpy(char* p1, const char* p2, int count)
{
char* ret = p1;
while (count &&(*p1++ = *p2++))
{
count--;
}
if (count)
while (--count)
*p1++ = "\0";
return ret;
}
用到了短路效应,字符串长度不够会补\0
字符追加strncat
char* my_strcat(char* p1, const char* p2, int count)
{
char* ret = p1;
while (*p1)
{
++p1;
}
while (count--)
if (!(*p1++ = *p2++))
return ret;
*p1 = '\0';
return ret;
}
当穿进去的数字大于字符串长度不会补\0,直接return 跑了。
输入数字不大于字符串长度会自动补一个\0
p1++在循环条件判断结束之后还会加一指向下一个位置