如果一个字符串是其他的旋转。所有测试用例未运行

时间:2018-07-24 13:33:24

标签: c string pointers

我正在使用串联第二个字符串的逻辑,然后在其中搜索第一个字符串。 但是由于某种原因,该代码无法在所有测试用例中运行。

示例

s1 = rahul , s2 = hulra

s2.s2 = hulrahulra

,然后使用s1函数在s2.s2中搜索strstr()

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


int ifRotation(char *s1, char *s2)
{
    int l1 = strlen(s1);
    int l2 = strlen(s2);

    char str1[l1], str2[l2+ l2];

    int i;
    i = 0;

    while(*s1 != '\0')
    {
        str1[i] = *s1;
        i++;
        s1++;   
    }
    i = 0;
    while(*s2 != '\0')
    {
        str2[i] = *s2;
        i++;
        s2++;   
    }

    strcat(s2, s2);

    if(strstr(s2, s1))
    {
        return 1;
    }
    return 0;
}

int main() {
    //code

    int queries;

    scanf("%d", &queries);
    int array[queries];
    char str1[100];
    char str2[100];
    int i = 0;
    while(i < queries)
    {
        scanf("%s", &str1);
        scanf("%s", &str2);
        array[i] = ifRotation(str1, str2);
        i++;
    }

    i = 0;
    while(i < queries)
    {
        printf("%d\n", array[i]);
        i++;
    }

    return 0;
}

请告诉我代码有什么问题?

1 个答案:

答案 0 :(得分:0)

您只是从一个字符串复制到另一个字符串,复制例程有几个问题。

  1. char str1[l1]不够大。它应该是char str1[l1 + 1]。多余的1用于空字符。

  2. 字符串应始终以空字符'\0'结尾。

  3. s1s2递增直到达到空字符为止,因此到那时s1s2为空。

尝试使用以下代码复制字符串,您将看到s1/s2为空,str1/str2只是原始s1/s2的副本。

您可以按以下步骤修复复制:

char str1[l1 + 1], str2[l2 + 1];

int i;
i = 0;
while(*s1 != '\0')
{
    str1[i] = *s1;
    i++;
    s1++;
}
str1[i] = '\0';

i = 0;
while(*s2 != '\0')
{
    str2[i] = *s2;
    i++;
    s2++;
}
str2[i] = '\0';

printf("s1=%s, s2=%s, str1=%s, str2=%s\n", s1, s2, str1, str2);
//output: s1=, s2=, str1=old_s1, str2=old_s2

但这并没有真正实现任何目的。如果您只想检查"rahul""hulra"的反义词,请保持s1不变,将s2复制到reverse_s2并比较两个字符串如下:

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

int ifRotation(const char *s1, const char *s2)
{
    if(!s1 || !s2)
        return 0;

    int len2 = strlen(s2);
    char reverse_s2[len2 + 1];

    //copy s2 to reverse_s2 in reverse order:
    int i = 0;
    for(i = 0; i < len2; i++)
        reverse_s2[i] = s2[len2 - i - 1];
    reverse_s2[i] = '\0'; //add null character

    int result = strcmp(s1, reverse_s2) == 0;

    return result;
}

int main(void) 
{
    printf("%d\n", ifRotation("rahul", "hulra"));
    printf("%d\n", ifRotation("rahul", "luhar"));
    return 0;
}