我正在尝试编写一个程序,该程序告诉我两个字符串是否相同。如果他们有一个不同的chracter,他们就不是。
我有这个代码,但它不起作用,为什么?
#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个不完全相同的字符串时,它什么也不返回。(当我引入两个相同的字符串时,也会发生同样的情况,但应该是这样的)
我该怎么修?
这里有一个重要的错误。首先:经典的"c样式字符串"以null结尾。尽管还有其他选择(比如将长度存储在字符串之外),但以null结尾的字符串是语言(因为代码中的字符串文字由编译器以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是最基本的一个,只有两个字符*:
strncmp允许指定要比较的最大字符数,并比较字符串的一部分:
还有其他,只需查看链接即可。
请注意,最好使用库函数,因为即使在这样一个"简单"的函数中。有一些优化的方法可以比较字符串。比如用母语单词大小进行比较。在32位平台上,比较的时间要多花四倍,这还不包括执行字节操作所需的掩码。
您的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"
。
对于i = 0
,for
循环中的条件将计算为false。因此,你永远不会得到这样的陈述:
if (str1[i]!=str2[i]){
因此,您永远不会执行:
printf("They are not identical");
您可以使用修复逻辑错误
for (i=0; str1[i] != ' ' && str2[i] != ' '; 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] != ' ' || str2[i] != ' ' )
{
printf("They are not identical");
}
我有这个代码,但它不起作用,为什么因为循环条件str1[i]==str2[i]
将使内部if
条件始终为false。
我该怎么做才能修复它简单代码:
for ( i=0; str1[i]==str2[i] && str1[i]!=' '; i++) {
}
if ( str1[i]!=str2[i] ) {
printf("They are not identical");
}
或
i=0;
while ( str1[i]==str2[i] && str1[i]!=' ' ) {
i++;
}
if ( str1[i]!=str2[i] ) {
printf("They are not identical");
}
假设您有两个字符串,其中第一个字符不同。则您将不会进入循环,因为循环的条件(str1[i]=str2[i])失败,因此条件应为(str1[i]!='\0'&str2[i]!='\0')。"\0"是c样式字符串的最后一个字符。您还可以使用字符串内置函数,如"strcmp(str1,str2)"。