我正在使用串联第二个字符串的逻辑,然后在其中搜索第一个字符串。 但是由于某种原因,该代码无法在所有测试用例中运行。
示例
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;
}
请告诉我代码有什么问题?
答案 0 :(得分:0)
您只是从一个字符串复制到另一个字符串,复制例程有几个问题。
char str1[l1]
不够大。它应该是char str1[l1 + 1]
。多余的1用于空字符。
字符串应始终以空字符'\0'
结尾。
s1
和s2
递增直到达到空字符为止,因此到那时s1
和s2
为空。
尝试使用以下代码复制字符串,您将看到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;
}