C 判断一个字符串是否由另一个字符串旋转得到

1.题目

判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如:给定s1 = AABCD和s2 = BCDAA,返回1,给定s1=abcd和s2=ACBD,返回0.

2.程序代码

方法一:

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include <Windows.h>
#include <string.h>

int judge_char(const char arr1[7], char arr2[7], int sz)//定义函数,达到题目要求
{
    int i = 0;
    int j = 0;//定义参数,控制循环次数
    char mid = 0;//定义参数,作为中间量

    if (strcmp(arr1, arr2) == 0)//strcmp是比较两字符串内容的函数 
           //相等返回0,左边大返回正数,右边大返回负数
    {
        return 1;
    }

    while (j < sz)//循环次数不能超过字符串长度
    {
        i = 0;//每次循环都要给i初始化

        mid = arr2[0];
        while (i < sz - 1)
        {
            arr2[i] = arr2[i + 1];
            i++;
        }
        arr2[sz - 1] = mid;//把元素整体向左移动,第一个元素放到最后

        if (strcmp(arr1, arr2) == 0)
        {
            return 1;
        }

        j++;
    }

    return 0;
}

int main()
{
    char s1[] = "ABCDEF";//定义字符串
    char s2[7] = { 0 };
    int sz = sizeof(s1) / sizeof(s1[0]) - 1;//计算字符串的长度,
      //字符串中隐藏着一个“\0”,所以计算出来的数要减去1才是字符串中元素的个数

    printf("please input a string(include 6 character):");
    scanf("%s", &s2);

    printf("%d\n", judge_char(s1, s2, sz));

    system("pause");
    return 0;
}

方法二:

//该方法所用的思想为把一个字符串拷贝之后拼接到后面形成如下形式:
//ABCDEFABCDEF 若另一个字符串为原字符串旋转后得到的 那么这个字符串一定是这个
//拼接后的字符串的子串

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include <Windows.h>
#include <string.h>
#include <stdlib.h>

#define N 7

int judge_char(char *s1, char *s2)//
{
    char *p = malloc(strlen(s1) + strlen(s1) + 1);//开辟动态内存空间,两个
    //字符串的长度加上一个'\0'的长度

    strcpy(p, s1);//把字符串s1的内容拷贝到p

    strcat(p, s1);//把字符串p与s1拼接到一起
    //printf("p = %s\n", p);

    if (strstr(p, s2) == NULL)//strstr函数是判断后者是否为前者的子串,
                   //若不是返回NULL
    {
        return 0;
    }
        return 1;
}

int main()
{
    char s1[N] = "ABCDEF";
    char s2[N] = { 0 };//定义两个字符串

    printf("please input a character string(include 6 character):");
    scanf("%s", &s2);

    printf("%d", judge_char(s1, s2));

    system("pause");
}

3.执行结果

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值