| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1016 人关注过本帖
标题:(新手求助)大佬们帮忙看看代码是哪里有问题
只看楼主 加入收藏
Sopphhiiaa
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2020-12-7
结帖率:80%
收藏
已结贴  问题点数:5 回复次数:3 
(新手求助)大佬们帮忙看看代码是哪里有问题
将一个字符串循环向右移M(M>=0)个字符位置,即将字符串A中的数据由(A0 A1……AN-1)变换为(AN-M …… AN-1 A0 A1……AN-M-1)(N是字符串的长度,最后M个数循环移至最前面的M个位置)。
输入
每个输入包含一个测试用例,第1行输入M(M>=0);第2行为输入字符串,长度不超过200。
输出
在一行中输出循环右移M位以后的字符串。
样例1
输入                                           输出
2
Hello World Here I Come                        meHello World Here I Co
提示
可以使用scanf读入整数,但不能使用scanf读入字符串,因为字符串中可能包含空格。可以使用fgets读入字符串,但要注意处理上一行末和本行末的的回车换行符。
(感觉自己的解法思路没啥问题,可是就是运行不出结果。)
程序代码:
#include <stdio.h>
#include <string.h>
int main(void)
{
    int n,len,i,j;
    scanf("%s\n",&n);
    char str1[199];
    fgets(str1,199,stdin);
    len = strlen(str1);
    str1[len + n]=str1[199];
    
    char b[len+n];
    for(i=0;i<len;i++)
    {
        b[i]=str1[i];
    }//遍历数组 
    for(j=len-2;j>=0;j--)
    {
        b[j+n]=str1[j];
    }//整体往右移n位 
    while(n--) 
    {
        b[n-1]=b[len-2+n];
    }//将最后的n位移到前面去

    printf("%s",b);
    return 0;
} 


搜索更多相关主题的帖子: 代码 输入 字符串 输出 读入 
2020-12-14 22:03
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:0 
程序代码:
#include <stdio.h>
#include <string.h>

int main( void )
{
    size_t m;
    char s[202]; // 你的“199”是哪来的?
    size_t s_len;

    // 数据输入
    scanf( "%zu", &m );
    scanf( "%*[^\n]" ); // 去除第一行数字之后,回车之前,的所有字符
    scanf( "%*c" ); // 去除第一行尾部的回车
    fgets( s, sizeof(s), stdin );
    s_len = strlen(s);
    if( s_len!=0 && s[s_len-1]=='\n' )
        s[--s_len] = '\0';

    // 处理我就不写了,我直接使用 printf 作弊了
    // 你应该参考一下 std::rotate 的实现,那是最高效的算法
    // 或者使用 左边颠倒 + 右边颠倒 + 整体颠倒 的算法,这算法写起来简单
    // 而你是另开一个数组做挪腾,既作了弊,又浪费了时间。费这么大功夫作弊,不如规规矩矩完成作业
    m = s_len==0 ? 0 : m%s_len;
    printf( "%s%.*s\n", s+s_len-m, (int)(s_len-m), s );
}


[此贴子已经被作者于2020-12-15 09:51编辑过]

2020-12-15 09:29
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:3 
下面的算法是我从 std::rotate 中扣出来的,没检查过,可能有错

程序代码:
#include <stdio.h>
#include <string.h>

void rotate( char s[], size_t len, size_t m )
{
    const size_t m2 = len==0 ? 0 : m%len;
    const size_t m1 = len - m2;
    size_t g = m1;
    for( size_t b=m2; b!=0; )
    {
        size_t t = g;
        g = b;
        b = t%b;
    }
    if( m1==0 || m2==0 )
        g = 0;

    for( size_t p=0; p!=g; ++p )
    {
        char t = s[p];
        size_t p1 = p;
        for( size_t p2=p+m1; p2!=p; )
        {
            s[p1] = s[p2];
            p1 = p2;
            p2 = p2<m2 ? p2+m1 : p2-m2;
        }
        s[p1] = t;
    }
}

int main( void )
{
    size_t m;
    char s[202]; // 最多200个字符,再加一个可能的'\n',再加一个'\0'
    size_t s_len;

    // 数据输入
    scanf( "%zu", &m );
    scanf( "%*[^\n]" ); // 去除第一行数字之后,回车之前,的所有字符
    scanf( "%*c" ); // 去除第一行尾部的回车
    fgets( s, sizeof(s), stdin );
    s_len = strlen(s);
    if( s_len!=0 && s[s_len-1]=='\n' )
        s[--s_len] = '\0';

    rotate( s, s_len, m );
    puts( s );
}


[此贴子已经被作者于2020-12-15 11:57编辑过]

2020-12-15 10:22
风过无痕1989
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:8
帖 子:228
专家分:1050
注 册:2020-7-17
收藏
得分:3 
回复 楼主 Sopphhiiaa
程序代码:
#include <stdio.h>
int main(void)
{
    int n, m, N[256], i = 0, j = 0;
    scanf("%d%d", &n,&m);// n 是字符串长度,m 是需要截取的字符串个数
    getchar();// 吸收输入时的回车键,以免被存入 N[0]
    while (j != -1)// 输入原字符串
    {
        N[i] = getchar();
        if (n == i)
            j = -1;
        else
            i++;
    }

    char b[256];// 这种定义数组,很多编译器不支持,因为它们不支持C99
    j = 0;
    for (i = n - m;i < n;i++)
    {
        b[j] = N[i];// 将后面 m 个字符串先置于b数组
        j++;
    }

    for (i = 0;i < n - m;i++)
    {
        b[j] = N[i];// 将前面 n - m 个字符串置于b数组
        j++;
    } 
    b[j] = '\0';//设置字符串结束标志

    printf("%s\n", b);
    return 0;
}
2020-12-15 10:32
快速回复:(新手求助)大佬们帮忙看看代码是哪里有问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025524 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved