C:逐日一题:字符串左旋

[复制链接]
发表于 2026-2-9 23:02:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
标题:实现一个函数,可以实现字符串的左旋
比方:ABCD左旋一个字符就是BCDA;ABCD左旋两个字符就是CDAB;
1、解题思绪:

1.确定目的旋转k个字符,我们要获取字符串的长度 len,目的是根据长度来处理惩罚 k 大概超出字符串长度的情况;
2.创建一个函数 left 来实现字符串左旋;
3.对k举行取模运算:k%=len,该表达式目的是盘算现实旋转次数。假设字符串长度是 5,而要左旋 7 个字符,现实上相当于左旋 7 % 5 = 2 个字符。
4.创建一个暂时数组 temp 来存放要左旋的 k 个字符,防止后续移动字符串时数据丢失。
5.利用 strncpy 将字符串前 k 个字符复制到 temp 中,利用 memmove 函数移动字符串,把从第 k 个字符开始的部门向前移动 k 个位置。(等会简朴先容一下函数的利用)
6.利用 strncat 函数将生存在 temp 中的前 k 个字符拼接到移动后的字符串反面,完成左旋操纵。
2、知识增补:

注:这里就简朴先容一下用法,能让各人读懂我反面写的代码,反面会专门出一篇文章来先容这些函数。以下先容的函数利用都须要加上头文件<string.h>
1、strncpy
strncpy是字符串复制函数,作用是将指定命目的字符从源字符串复制到目的字符串。
函数原型:char *strncpy(char *dest, const char *src, size_t n)

  • dest:目的字符串。
  • src :源字符串。
  • n :要复制的最大字符数。
利用:
  1. #include <stdio.h>
  2. #include <string.h>
  3. int main() {
  4.     char dest[10];
  5.     char src[] = "Hello";
  6.     strncpy(dest, src, 2);  // 复制 src 的前 2 个字符到 dest
  7.     dest[2] = '\0';  // 手动添加字符串结束符
  8.     printf("%s\n", dest);  // 输出 "He"
  9.     return 0;
  10. }
复制代码
2.memmove
memmove是内存操纵函数,作用是将 n个字节的数据从 src 所指向的内存地区复制到 dest 所指向的内存地区,可以处理惩罚源内存地区和目的内存地区重叠的情况,包管准确地复制数据。
函数原型:void *memmove(void *dest, const void *src, size_t n)

  • dest:指向目的内存地区的指针,数据将被移动到这里。
  • src:指向源内存地区的指针,数据将以后处移动。
  • n :要移动的字节数。
利用:
  1. #include <stdio.h>
  2. #include <string.h>
  3. int main() {
  4.     char str[] = "HelloWorld";
  5.     memmove(str + 5, str, 5);
  6.     printf("%s\n", str);
  7.     return 0;
  8. }
复制代码

3.strncat 
 strncat是字符拼接函数,作用是将源字符串 scr 中的最多 n 个字符拼接到目的字符串 dest 的末了,并在拼接后的字符串末了主动添加字符串竣事符 '\0'
函数原型:char *strncat(char *dest, const char *src, size_t n)(同上)
利用:
  1. #include <stdio.h>
  2. #include <string.h>
  3. int main() {
  4.     char dest[20] = "Hello, ";
  5.     char src[] = "World!";
  6.     strncat(dest, src, 5);  // 拼接 src 的前 5 个字符
  7.     printf("%s\n", dest);  // 输出 "Hello, World"
  8.     return 0;
  9. }
复制代码

3、代码展示及分析:
  1. #include <stdio.h>
  2. #include <string.h>
  3. void left(char* str, int k)//完成字符左旋操作
  4. {
  5.         int len = strlen(str);
  6.         k %= len;//实际左旋次数
  7.         char temp[2];//这里使用2表示是因为在vs2022上表达式必须含有常量值
  8.         strncpy(temp, str, k);//复制要左旋的k个字符到临时数组temp中
  9.         memmove(str, str + k, len - k);//移动字符串
  10.         str[len - k] = '\0';//确保完整性
  11.         strncat(str, temp, k);//将存储在 temp 中的前 k 个字符拼接到移动后的字符串后面
  12. }
  13. int main()
  14. {
  15.         char str[] = "abcd";
  16.         int k = 2;//左旋个数为2
  17.         printf("左旋前:%s\n", str);
  18.         left(str, k);//实现左旋操作的函数调用
  19.         printf("左旋后:%s\n", str);
  20.         return 0;
  21. }
复制代码
char temp[2]这是由于vs2022不支持变长数组才如许写的代码,如果你所利用的编译器支持边长数组,可以改进一下代码
代码改进:
  1. #include <stdio.h>
  2. #include <string.h>
  3. void left(char* str, int k)
  4. {
  5.         int len = strlen(str);
  6.         k %= len;
  7.         char temp[k];//变长数组
  8.         strncpy(temp, str, k);
  9.         memmove(str, str + k, len - k);
  10.         str[len - k] = '\0';
  11.         strncat(str, temp, k);
  12. }
  13. int main()
  14. {
  15.         char str[] = "abcd";
  16.         int k = 2;
  17.         printf("左旋前:%s\n", str);
  18.         left(str, k);
  19.         printf("左旋后:%s\n", str);
  20.         return 0;
  21. }
复制代码
 
如果在支持变长数组,如许写代码会更加的方便,你只须要修改所输入k的值就可以实现左旋差别个字符,比方:输入k=1,左旋一个字符;输入k=2,左旋两个字符。
4、倒霉用这些库函数来实现字符串左旋

代码及解释:(这个是连合老师的解说所写的)
  1. #include <stdio.h>
  2. // 左旋字符串函数
  3. void left(char* str, int k)
  4. {
  5.     int len = 0;  // 存储字符串长度
  6.     char* p = str;  //遍历字符串计算长度
  7.     while (*p) // 计算字符串长度
  8.     {
  9.         len++;
  10.         p++;
  11.     }
  12.     k %= len;  // 实际左旋次数
  13.     for (int i = 0; i < k; i++)  // 进行左旋操作
  14.     {
  15.         char temp = *str;  // 保存字符串要左旋的k个字符  
  16.         for (int j = 0; j < len - 1; j++)  // 将字符串从第二个字符开始依次向前移动一位
  17.         {
  18.             *(str + j) = *(str + j + 1);
  19.         }
  20.         *(str + len - 1) = temp;  // 将保存的k个字符放到字符串尾部
  21.     }
  22. }
  23. int main()
  24. {
  25.     char str[] = "ABCD";
  26.     int k = 2;
  27.     printf("左旋前: %s\n", str);
  28.     left(str, k);
  29.     printf("左旋后: %s\n", str);
  30.     return 0;
  31. }
复制代码

回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表