PeterNzz 发表于 2022-5-24 20:05:31

字符串的循环移位(左移) C语言

题目描述
给定一个字符串长度为 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;
                p=p;
                p=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;
                int i=0;
                for(i=0;ini_str!='\0';i++)
                {
                        scanf("%s",&ini_str);
                }
                int len=strlen(ini_str);
                shift(ini_str,n);
                for(i=0;i<len;i++)
                {
                        printf("%s\n",ini_str);
                }
        }
        return 0;
}

wp231957 发表于 2022-5-24 20:36:57

字符串 abcdefghijk , 循环向左移动 33 位就变成 defghijkabc
不对吧,移动33位不还是原始字符串吗

jackz007 发表于 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 ++)                                     ;
      for(i = 0 ; i < k ; i ++) {
                for(c = s , j = 1 ; j < m ; j ++) s = s ;
                s = c                                       ;
      }
      return s                                                   ;
}

int main(void)
{
      char s                                                ;
      int k , n                                                    ;
      scanf("%d" , & k)                                          ;
      fflush(stdin)                                                ;
      fgets(s , 104 , stdin)                                       ;
      for(n = 0 ; s ; n ++)                                     ;
      s = '\0'                                              ;
      printf("%s\n" , shift(s , k))                              ;
}

PeterNzz 发表于 2022-5-24 20:41:22

wp231957 发表于 2022-5-24 20:36
字符串 abcdefghijk , 循环向左移动 33 位就变成 defghijkabc
不对吧,移动33位不还是原始字符串吗

题目复制过来的时候出错了 是左移3位,不是33位(对不起!) 但是我想知道我的代码没有输出是什么原因造成的呢?看了好久也没头绪,可以帮我看看嘛(求求)

wp231957 发表于 2022-5-24 20:45:45

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

我没看明白你的思路
你的第一个函数是逆置字符串(这个和移动有关系?)第二个函数就不知道是干啥的

傻眼貓咪 发表于 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;
}

jhq999 发表于 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; 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;
                        p=temp1;
                        temp1=temp2;
                        j=k;
                }
               
      
      
}
int main()
{
      int n;
      while(scanf("%d",&n)!=EOF)
      {
                char ini_str;
                int i=0;
                                scanf("%s",ini_str);
               
                int len=strlen(ini_str);
                inversion(ini_str,len,n);
                printf("%s\n",ini_str);
            
      }
      return 0;
}
页: [1]
查看完整版本: 字符串的循环移位(左移) C语言