比较C语言中两个字符串的排列
我刚开始学习C-basics,并尝试解决这个问题,在这里,我们必须检查两个字符串是否相等,提供任何排列。 您可以参考此链接: 我只是想得到一些关于如何改进代码的解决方案,这些代码只给出“否”的输出:比较C语言中两个字符串的排列,c,c-strings,C,C Strings,我刚开始学习C-basics,并尝试解决这个问题,在这里,我们必须检查两个字符串是否相等,提供任何排列。 您可以参考此链接: 我只是想得到一些关于如何改进代码的解决方案,这些代码只给出“否”的输出: #include<stdio.h> #include<stdlib.h> #include<string.h> int main() { int i, j, k, m, n, o, p; char a[100000], b[100000], *c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
int i, j, k, m, n, o, p;
char a[100000], b[100000], *c, *d;
scanf("%d", &i);
for (j = 0; j < i; j++)
{
scanf("%s %s", a, b);
}
for (k = 0; a[k] != '\0'; k++)
{
n = rand() % k;
}
for (m = 0; b[m] != '\0'; m++)
{
o = rand() % m;
}
for (p = 0; p < j; p++)
{
if (a[n] == b[o])
{
printf("YES");
}
else
{
printf("NO");
}
}
return 0;
}
#包括
#包括
#包括
int main()
{
inti,j,k,m,n,o,p;
字符a[100000],b[100000],*c,*d;
scanf(“%d”、&i);
对于(j=0;j
谢谢你的帮助 比较两个字符串使用的
strcmp()
:
参数:
- 如果返回值<0,则表示str1小于str2
- 如果返回值>0,则表示str2小于str1
- 如果返回值=0,则表示str1等于str2
#include <stdio.h>
#include <string.h>
int main () {
char str1[15];
char str2[15];
int ret;
strcpy(str1, "abcdef");
strcpy(str2, "ABCDEF");
ret = strcmp(str1, str2);
if(ret < 0) {
printf("str1 is less than str2");
} else if(ret > 0) {
printf("str2 is less than str1");
} else {
printf("str1 is equal to str2");
}
return(0);
}
#包括
#包括
int main(){
char-str1[15];
char-str2[15];
int ret;
strcpy(str1,abcdef);
strcpy(str2,“ABCDEF”);
ret=strcmp(str1,str2);
如果(ret<0){
printf(“str1小于str2”);
}否则如果(ret>0){
printf(“str2小于str1”);
}否则{
printf(“str1等于str2”);
}
返回(0);
}
因为您只需要一些关于改进代码的建议
scanf(“%20s”,str1)
或类似的方法来改善答案的内存占用。您需要使用循环来读取字符串<代码>%20s要求scanf最多读取20个字符。您可以根据自己的需要定制号码string.h
中包含的strlen
函数获取字符串的长度for (p = 0; p < j; p++)
{
if (a[n] == b[o])
{
printf("YES");
}
else
{
printf("NO");
}
}
for(p=0;p
该for循环将执行i
次,因为j
的当前值将是i
之前执行的第一个for循环。根据上述原因,这些循环中的每一个都将比较相同的a[n]
和b[o]
。因此结果将是YES
xi
或NO
xi
。不管字符串是什么
希望这能解释代码的错误。不清楚您试图通过
rand()
函数实现什么,但现在您肯定需要找到不同的排列来实现这一点。字符串s1的排列应该等于字符串s2,这意味着字符串s1中的所有字符都应该出现在s2中,并且两个字符串中每个字符的计数应该相同
以下是一个工作版本:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//CHECKING IF STRING TWO IS ANY PERMUTATION OF STRING ONE
int main()
{
char str_one[]="abbcd";
char str_two[]="bcab";
int arr[26]={0};
int index=0;
int len_one=strlen(str_one);
int len_two=strlen(str_two);
int val;
if(len_one!=len_two)
{
printf("NO");
exit(0);
}
while(index<len_one)
{
++arr[str_one[index++]-'a'];
}
index=0;
while(index<len_two)
{
--arr[str_two[index++]-'a'];
if(arr[str_two[index]-'a']<0)
{
printf("NO");
exit(0);
}
}
index=0;
while(index<26)
{
if(arr[index]!=0)
{
printf("NO");
exit(0);
}
++index;
}
printf("yes");
return 0;
}
#包括
#包括
#包括
//检查字符串2是否是字符串1的任何排列
int main()
{
char str_one[]=“abbcd”;
char str_two[]=“bcab”;
int-arr[26]={0};
int指数=0;
int len_one=strlen(str_one);
int len_two=strlen(str_two);
int-val;
if(len_one!=len_two)
{
printf(“否”);
出口(0);
}
虽然(字符串s1
的索引排列应该等于字符串s2
,这意味着字符串s1
中的所有字符都应该出现在s2
中,并且两个字符串中的每个字符的计数应该相同-执行时有什么问题?您可能需要使用si的整数数组ze26
。你在数组中保留了20万字节:/这太荒谬了(而且很容易利用)。最好在您的scanf格式中使用长度说明符。正如Observer所说,您可以只计算每个字符的出现时间,并在可能的情况下比较这些计数。欢迎使用StackOverflow。问题不仅仅是使用strcmp
比较字符串。我以前尝试过将字符串与strcmp进行比较。但是,这是正确的I don’我没有得到一个SIGSEGV/分段错误。我想问这个问题的用户实际上遇到了一个问题,即输出的唯一内容是“否”.我真的同意雅库普·图尔坎解决这个问题的方法,这很有效,非常感谢!!但是,我也想知道我错在哪里,或者说,为什么我不能用我尝试的方式得到答案?如果这看起来很麻烦,很抱歉,但是,因为我只是一个初学者,我很想知道我的代码有什么问题,就像OrdoFlammae评论的那样。@Sujayritikar你应该我想解释一下你的代码段在做什么,它们的预期用途是什么,那么只有我们能提供帮助。@Sujayrttikar我不明白你在用带有rand函数的循环来做什么。如果你能解释一下你认为它做了什么,我可能会说它是否像你预期的那样工作,并评估错误在哪里。@YakupTürkan我想知道我想要得到字符串中字符总数的一个随机整数。通过继续循环这些随机抽取的整数,我可以比较两个字符串的字符。
for (j = 0 ; j < i ; j++)
{
scanf("%s %s", a, b);
/* do comparision for each here */
}
for (k = 0; a[k] != '\0'; k++)
{
n = rand() % k;
}
for (m = 0; b[m] != '\0'; m++)
{
o = rand() % m;
}
for (p = 0; p < j; p++)
{
if (a[n] == b[o])
{
printf("YES");
}
else
{
printf("NO");
}
}
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//CHECKING IF STRING TWO IS ANY PERMUTATION OF STRING ONE
int main()
{
char str_one[]="abbcd";
char str_two[]="bcab";
int arr[26]={0};
int index=0;
int len_one=strlen(str_one);
int len_two=strlen(str_two);
int val;
if(len_one!=len_two)
{
printf("NO");
exit(0);
}
while(index<len_one)
{
++arr[str_one[index++]-'a'];
}
index=0;
while(index<len_two)
{
--arr[str_two[index++]-'a'];
if(arr[str_two[index]-'a']<0)
{
printf("NO");
exit(0);
}
}
index=0;
while(index<26)
{
if(arr[index]!=0)
{
printf("NO");
exit(0);
}
++index;
}
printf("yes");
return 0;
}