鱼C论坛

 找回密码
 立即注册
查看: 1586|回复: 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 编辑
void inversion(char *p,int len,int n,int isleft=1)
{
        char temp1,temp2;
                for (int i = 0,j=0,temp1=p[0]; i < len; i++)
                {
                        int k;
                        //if(isleft)k=j<n?len-n+j:j-n;
                        if(isleft)k=(len-n+j)%len
                        else
                                k=(j+n)%len;
                        temp2=p[k];
                        p[k]=temp1;
                        temp1=temp2;
                        j=k;
                }
                
        
        
}
int main()
{
        int n;
        while(scanf("%d",&n)!=EOF)
        {
                char ini_str[100];
                int i=0;
                                scanf("%s",ini_str);
                
                int len=strlen(ini_str);
                inversion(ini_str,len,n);
                printf("%s\n",ini_str);
             
        }
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-5-24 20:36:57 From FishC Mobile | 显示全部楼层
字符串 abcdefghijk , 循环向左移动 33 位就变成 defghijkabc
不对吧,移动33位不还是原始字符串吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

char * shift(char s[] , int k)
{
        int i , j , m                                                ;
        char c                                                       ;
        for(m = 0 ; s[m] ; m ++)                                     ;
        for(i = 0 ; i < k ; i ++) {
                for(c = s[0] , j = 1 ; j < m ; j ++) s[j - 1] = s[j] ;
                s[m - 1] = c                                         ;
        }
        return s                                                     ;
}

int main(void)
{
        char s[104]                                                  ;
        int k , n                                                    ;
        scanf("%d" , & k)                                            ;
        fflush(stdin)                                                ;
        fgets(s , 104 , stdin)                                       ;
        for(n = 0 ; s[n] ; n ++)                                     ;
        s[n - 1] = '\0'                                              ;
        printf("%s\n" , shift(s , k))                                ;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

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

使用道具 举报

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

void shiftLeft(char* str, int n) {
    char t, * p;
    int N = strlen(str);
    for (int i = 0; i < n; ++i) {
        t = (*str);
        for (p = str; p < str + N - 1; ++p) (*p) = *(p + 1);
        (*p) = t;
    }
}

int main()
{
    char str[] = "abcdefghijk";
    shiftLeft(str, 3);
    printf("%s", str);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-24 21:13:19 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jhq999 于 2022-5-24 21:20 编辑
void inversion(char *p,int len,int n,int isleft=1)
{
        char temp1,temp2;
                for (int i = 0,j=0,temp1=p[0]; i < len; i++)
                {
                        int k;
                        //if(isleft)k=j<n?len-n+j:j-n;
                        if(isleft)k=(len-n+j)%len
                        else
                                k=(j+n)%len;
                        temp2=p[k];
                        p[k]=temp1;
                        temp1=temp2;
                        j=k;
                }
                
        
        
}
int main()
{
        int n;
        while(scanf("%d",&n)!=EOF)
        {
                char ini_str[100];
                int i=0;
                                scanf("%s",ini_str);
                
                int len=strlen(ini_str);
                inversion(ini_str,len,n);
                printf("%s\n",ini_str);
             
        }
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-6 00:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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