我已尝试过这段代码,但它似乎无法正常工作,如何摆脱嵌套循环?
#include <stdio.h>
#include <string.h>
int meme(char s1[], char s2[])
{
int i = 0, j = 0;
int different;
while (i <= strlen(s1) && different == 1) {
while (j <= strlen(s2)) {
if (s1[i] != s2[j]) {
different = 1;
} else {
different = 0;
}
j = j + 1;
}
i = i + 1;
}
return different;
}
答案 0 :(得分:0)
你的代码有很多错误。
你为什么在strlen()
打电话给while()
?每次都会执行它,直到循环没有退出并且会降低性能。
此外,变量different
未使用值1
进行初始化,那么您如何确定该变量的初始值?
我还试图简化你的功能,还有优化的余地:
int meme(char s1[], char s2[])
{
int i = 0;
int different;
int str1_len = strlen(s1);
int str2_len = strlen(s2);
if(str1_len > str2_len)
str1_len = str2_len;
do{
if(s1[i] == s2[i])
{
printf("Common\n");
different = 0;
}
else
{
different = 1;
}
i++;
}while(str1_len--);
return different;
}
答案 1 :(得分:0)
different
,因为它是未定义的,如果不是 - 这可能会破坏你的第一个while循环,因为different
可能是一个随机数&gt; 1。strlen
为您提供字符串中的字符数,不包括终止字符串的空字符(请参阅here)。但是,您不仅要比较两个字符串的字符,还要比较空字符,可能会隐含地检查字符串的长度是否相同。虽然这应该有效,但最好先通过比较字符串的长度来明确地进行检查,因为它更不容易出错。基于以上几点的可能解决方案:
#include <stdio.h>
#include <string.h>
int meme(char s1[], char s2[]){
int i = 0;
int len_s1 = 0;
int len_s2 = 0;
int different = 0;
len_s1 = strlen(s1);
len_s2 = strlen(s2);
if (len_s1 == len_s2) {
for (i = 0 ; i < len_s1 ; i++) {
if (s1[i] != s2[i]) {
different = 1;
break;
}
}
else {
different = 1;
}
return different;
}
还有一件事 - 做好自己和其他人的帮助并打算使用你的代码,否则很难阅读!
答案 2 :(得分:0)
您的代码未经过优化,并且您没有使用好的方法来执行此任务。我修改了代码,它将以最小化复杂度来完成工作。
这里我假设数组的大小与
一样。bool meme(char s1[], char s2[])
{
int i=0;
while(s1[i] != NULL && s2[i] != NULL)
{
if(s1[i] == s2[i])
return false;
i += 1;
}
return true;
}
当你调用这个函数然后声明一个 bool 类型的变量,并将该函数的返回值存储在该变量中。
例如:
bool check;
bool = meme(array 1 , array 2);
然后检查返回的值是否为 true ,然后两个数组完全不同。您可以通过以下代码执行此操作:
if(check)
printf("Arrays are different");
else
printf("Arrays are not different");
如果它更适合你,你也可以使用int代替bool但是记住,无论你编写什么代码,都必须最简单。并且认为如果你使用int,那么你只返回 0或1 ;但 int在32位编译器中占用2个字节,在64位编译器中占用4个字节,但 bool在某些语言中仅占用1个字节甚至1个字符,如pascal (如果我没错。)
并且不要与return true;
和return false;
混淆。 True表示1,false表示0 。 布尔类型变量只能存储二进制数(1或0)。