我正在尝试编写一个程序,告诉我2个字符串是否为identcal。如果他们有一个不同的字符他们不是。
我有这段代码,但它不起作用,为什么?
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main() {
char str1[30], str2[30];
int i;
printf("\nEnter two strings :");
gets(str1);
gets(str2);
for (i=0;str1[i]==str2[i];i++)
if (str1[i]!=str2[i]){
printf("They are not identical");
}
else continue;
return (0);
}
它编译0错误和0警告,但是当我引入2个不相同的字符串时,它什么都不返回。 (当我引入2个相同的字符串时会发生同样的情况,但这应该是怎样的)
我该怎么办才能修复它?
答案 0 :(得分:1)
您的for
循环是:
for (i=0;str1[i]==str2[i];i++)
if (str1[i]!=str2[i]){
printf("They are not identical");
}
else continue;
假设str1
为"abc"
且str2
为"xyz"
。
for
循环中的条件将i = 0
评估为false。因此,你永远不会得到声明:
if (str1[i]!=str2[i]){
因此,您永远不会执行:
printf("They are not identical");
您可以使用以下方法修复逻辑错误:
for (i=0; str1[i] != '\0' && str2[i] != '\0'; i++)
{
if (str1[i]!=str2[i]) {
break;
}
}
// If at end of the loop, we have reached the ends
// of both strings, then they are identical. If we
// haven't reached the end of at least one string,
// then they are not identical.
if ( str1[i] != '\0' || str2[i] != '\0' )
{
printf("They are not identical");
}
答案 1 :(得分:1)
这里有一个重要的错误。首先:经典的“c style string”以null结尾。尽管还有其他选择(比如存储字符串之外的长度),空终止字符串是语言的一部分(因为代码中的字符串文字由编译器终止),并且运行时库(大多数字符串函数处理\字符串末尾为0)。
gets也会在输入的字符串末尾添加\ 0: http://www.cplusplus.com/reference/cstdio/gets/
您不仅要比较输入的字符串,还要比较内存中该字符串之后的任何内容(随机)。
它应该是这样的:
for(int i=0;str1[i]==str2[i];i++){
if(str1[i]==0) {
printf("equal");
}
}
printf("not equal");
还有其他选择,比如使用指针。但是在现代编译器上,它们应该生成大致相同的机器代码。
请注意,有C运行时库函数来比较字符串:
strcmp是最基本的,只有两个char *:
strncmp允许指定要比较的maximium字符,比较字符串的一部分:
还有其他,只需查看链接。
请注意,最好使用库函数,因为即使在这样的“简单”函数中也是如此。有优化的方法来比较字符串。喜欢比较原生单词大小。在32位平台上,您将花费四倍的时间进行比较,不包括执行字节操作所需的屏蔽。
答案 2 :(得分:1)
我有这段代码,但它不起作用,为什么?
因为循环条件str1[i]==str2[i]
会使内部if
条件始终为false。
我该怎么办才能修复它? 简单的代码:
for ( i=0; str1[i]==str2[i] && str1[i]!='\0'; i++) {
}
if ( str1[i]!=str2[i] ) {
printf("They are not identical");
}
或
i=0;
while ( str1[i]==str2[i] && str1[i]!='\0' ) {
i++;
}
if ( str1[i]!=str2[i] ) {
printf("They are not identical");
}
答案 3 :(得分:0)
假设您有两个字符串,其中第一个字符不同。然后你不会进入循环,因为循环的条件(str1 [i] == str2 [i])失败,因此条件应该是(str1 [i]!='\ 0'&amp;&amp; str2 [i ]!='\ 0')。 '\ 0'是c风格字符串的最后一个字符。 您还可以使用字符串内置函数,如“strcmp(str1,str2)”。