鱼C论坛

 找回密码
 立即注册
查看: 2095|回复: 6

[已解决]字符串的循环移位(左移) C语言

[复制链接]
发表于 2022-5-24 20:05:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

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

x
题目描述
给定一个字符串长度为 nn 的字符串 s1 (10 < n < 10010<n<100) , 求出将字符串循环向左移动 k位的字符串 s2 (1 < k < n1<k<n) , 例如:字符串 abcdefghijk , 循环向左移动 33 位就变成 defghijkabc

输入描述
输入仅两行,第一行为左移的位数 k, 第二行为字符串 s1 .

输出描述
输出仅一行,为将字符串 s1 左移 k 位得到的字符串 s2 .

样例输入
Copy to Clipboard
3
abcdefghijk
样例输出
Copy to Clipboard
defghijkabc


问题:请问我的代码为什么没有结果

代码:
#include<stdio.h>
#include<string.h>
void inversion(char *p,int start,int end)
{
        char temp;
        while(start<end)
        {
                temp=p[start];
                p[start]=p[end];
                p[end]=temp;
                ++start;
                --end;
        }
}
void shift(char *p,int n)
{
        int len=strlen(p);
        n%=len;
        inversion(p,0,n-1);
        inversion(p,n,len-1);
        inversion(p,0,len-1);
}
int main()
{
        int n;
        while(scanf("%d",&n)!=EOF)
        {
                char ini_str[100];
                int i=0;
                for(i=0;ini_str[i]!='\0';i++)
                {
                        scanf("%s",&ini_str[i]);
                }
                int len=strlen(ini_str);
                shift(ini_str,n);
                for(i=0;i<len;i++)
                {
                        printf("%s\n",ini_str[i]);
                }
        }
        return 0;
}

最佳答案
2022-5-24 21:13:19
本帖最后由 jhq999 于 2022-5-24 21:20 编辑
  1. void inversion(char *p,int len,int n,int isleft=1)
  2. {
  3.         char temp1,temp2;
  4.                 for (int i = 0,j=0,temp1=p[0]; i < len; i++)
  5.                 {
  6.                         int k;
  7.                         //if(isleft)k=j<n?len-n+j:j-n;
  8.                         if(isleft)k=(len-n+j)%len
  9.                         else
  10.                                 k=(j+n)%len;
  11.                         temp2=p[k];
  12.                         p[k]=temp1;
  13.                         temp1=temp2;
  14.                         j=k;
  15.                 }
  16.                
  17.         
  18.         
  19. }
  20. int main()
  21. {
  22.         int n;
  23.         while(scanf("%d",&n)!=EOF)
  24.         {
  25.                 char ini_str[100];
  26.                 int i=0;
  27.                                 scanf("%s",ini_str);
  28.                
  29.                 int len=strlen(ini_str);
  30.                 inversion(ini_str,len,n);
  31.                 printf("%s\n",ini_str);
  32.             
  33.         }
  34.         return 0;
  35. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-5-24 20:36:57 From FishC Mobile | 显示全部楼层
字符串 abcdefghijk , 循环向左移动 33 位就变成 defghijkabc
不对吧,移动33位不还是原始字符串吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-24 20:37:00 | 显示全部楼层
  1. #include <stdio.h>

  2. char * shift(char s[] , int k)
  3. {
  4.         int i , j , m                                                ;
  5.         char c                                                       ;
  6.         for(m = 0 ; s[m] ; m ++)                                     ;
  7.         for(i = 0 ; i < k ; i ++) {
  8.                 for(c = s[0] , j = 1 ; j < m ; j ++) s[j - 1] = s[j] ;
  9.                 s[m - 1] = c                                         ;
  10.         }
  11.         return s                                                     ;
  12. }

  13. int main(void)
  14. {
  15.         char s[104]                                                  ;
  16.         int k , n                                                    ;
  17.         scanf("%d" , & k)                                            ;
  18.         fflush(stdin)                                                ;
  19.         fgets(s , 104 , stdin)                                       ;
  20.         for(n = 0 ; s[n] ; n ++)                                     ;
  21.         s[n - 1] = '\0'                                              ;
  22.         printf("%s\n" , shift(s , k))                                ;
  23. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-24 20:41:22 | 显示全部楼层
wp231957 发表于 2022-5-24 20:36
字符串 abcdefghijk , 循环向左移动 33 位就变成 defghijkabc
不对吧,移动33位不还是原始字符串吗

题目复制过来的时候出错了 是左移3位,不是33位(对不起!) 但是我想知道我的代码没有输出是什么原因造成的呢?看了好久也没头绪,可以帮我看看嘛(求求)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-24 20:45:45 From FishC Mobile | 显示全部楼层
PeterNzz 发表于 2022-5-24 20:41
题目复制过来的时候出错了 是左移3位,不是33位(对不起!) 但是我想知道我的代码没有输出是什么原因造 ...

我没看明白你的思路
你的第一个函数是逆置字符串(这个和移动有关系?)第二个函数就不知道是干啥的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-24 20:59:56 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <string.h>

  3. void shiftLeft(char* str, int n) {
  4.     char t, * p;
  5.     int N = strlen(str);
  6.     for (int i = 0; i < n; ++i) {
  7.         t = (*str);
  8.         for (p = str; p < str + N - 1; ++p) (*p) = *(p + 1);
  9.         (*p) = t;
  10.     }
  11. }

  12. int main()
  13. {
  14.     char str[] = "abcdefghijk";
  15.     shiftLeft(str, 3);
  16.     printf("%s", str);
  17.     return 0;
  18. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-24 21:13:19 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jhq999 于 2022-5-24 21:20 编辑
  1. void inversion(char *p,int len,int n,int isleft=1)
  2. {
  3.         char temp1,temp2;
  4.                 for (int i = 0,j=0,temp1=p[0]; i < len; i++)
  5.                 {
  6.                         int k;
  7.                         //if(isleft)k=j<n?len-n+j:j-n;
  8.                         if(isleft)k=(len-n+j)%len
  9.                         else
  10.                                 k=(j+n)%len;
  11.                         temp2=p[k];
  12.                         p[k]=temp1;
  13.                         temp1=temp2;
  14.                         j=k;
  15.                 }
  16.                
  17.         
  18.         
  19. }
  20. int main()
  21. {
  22.         int n;
  23.         while(scanf("%d",&n)!=EOF)
  24.         {
  25.                 char ini_str[100];
  26.                 int i=0;
  27.                                 scanf("%s",ini_str);
  28.                
  29.                 int len=strlen(ini_str);
  30.                 inversion(ini_str,len,n);
  31.                 printf("%s\n",ini_str);
  32.             
  33.         }
  34.         return 0;
  35. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-12 18:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表