C语言 比较数组中名称字符串且不区分大小写的函数



在我的家庭作业中,我需要创建一个函数,它取10个名字并进行比较,告诉我名字是否相同。

首先,我做了一个函数,把名字放在一个数组中,然后我做了一个函数来检查它们是否相同。

一开始,我做了一个函数来检查一个字母一个字母是否相似:

int stringCmpi (char *s1,char *s2)
{
int i=0,diff=0;
for(i=0; s1[i]!=''; i++)
{
if( toupper(s1[i])!=toupper(s2[i]) )
return 1;
}
return 0;
} 

然后我做了一个函数来检查字符串,一个又一个的名字:

int cheak ()
{
int k;
int j=SIZE;
for(k=0;k<MAX;k++)
for(j=MAX;j>=k;j--)
{
if(1==stringCmpi(names[k],names[j]))
{
return 0;
}
return 1;
}
}

main中,我做到了:

if(cheak(names)==1)
{
printf("nyou repeat namesn");
}
if(cheak(names!=1))
{
printf("n great! the names are not repeatn");
}

但是我的代码中的某些内容是错误的,因为它可以编译但不起作用。所以,请帮助我 - 我将不胜感激。

正如KamilCuk在评论中所说,您遇到的一个重要问题是当您正在比较的字符串具有不同的长度时。在不使用标准库函数的情况下(我猜这是您的目标),您可以通过在比较函数的不同位置查找nul终止符来检查这一点。

这是一种方法:

int stringCmpi (char *s1,char *s2)
{
int i; // =0,diff=0; /// You don't use "diff" and "i" is initialized in the for loop!
for(i=0; s1[i]!=''; i++)
{
if( toupper(s1[i])!=toupper(s2[i]) ) // This check will catch situations where...
return 1; // ... s2 is SHORTER than s1, as s2[i] will be '' and s1 won't be!
}
// But we need to catch if s2 is LONGER than s1: s1[i] will now be ''...
// ... so we can just check that s2[i] is ALSO '' (i.e. it's same length):
if (s2[i] != '') return 1; // Different length strings!
return 0;
} 

请随时要求进一步澄清和/或解释。

编辑/PS:另外,正如Ed Heal所提到的,比较:if(cheak(names!=1))是非常可疑的 - 可能只是一个错字,你的意思是if(cheak(names)!=1)。但是,在这里使用else会容易得多!

让我们从函数stringCmpi开始。

int stringCmpi (char *s1,char *s2)
{
int i=0,diff=0;
for(i=0; s1[i]!=''; i++)
{
if( toupper(s1[i])!=toupper(s2[i]) )
return 1;
}
return 0;
} 

让我们假设s1"A"s2"AB".在这种情况下,函数返回 0,因为循环将在比较两个字符串的第一个字符'A'后停止其迭代。

所以这个函数是不正确的。

现在让我们考虑函数cheak

int cheak ()
{
int k;
int j=SIZE;
for(k=0;k<MAX;k++)
for(j=MAX;j>=k;j--)
{
if(1==stringCmpi(names[k],names[j]))
{
return 0;
}
return 1;
}
}

似乎标识符 MAX 表示数组中的字符串数。在这种情况下,值为 MAX 的索引说明符是一个不存在的字符串,因为索引的有效范围是[0, MAX)。因此,该函数已经具有未定义的行为。

如果两个名称不相等,则立即退出函数,尽管数组可以连接相同的名称。因此,该函数可能会返回错误的结果。

您需要的是以下内容。

#include <stdio.h>
#include <ctype.h>
int stringCmpi( const char *s1, const char *s2 )
{
while ( *s1 != '' && 
toupper( ( unsigned char )*s1 ) == toupper( ( unsigned char )*s2 ) )
{
++s1; ++s2;
}
return *s1 != *s2;
} 
int check( size_t m, size_t n, char  names[const m][n] )
{
int unique = 1;
for (size_t i = 0 ; unique && i < m; i++ )
{
for ( size_t j = i + 1; unique && j < m; j++ )
{
unique = stringCmpi( names[i], names[j] );
}
}
return unique;
}

int main(void) 
{
{
enum { M = 3, N = 10 };
char names[M][N] = { "Bob", "Tome", "David" };
if( check( M, N, names ) )
{
printf( "ngreat! the names are not repeatn" );
}
else
{
printf( "nyou repeat namesn" );
}           
}
{
enum { M = 3, N = 10 };
char names[M][N] = { "Bob", "Tome", "Bob" };
if( check( M, N, names ) )
{
printf( "ngreat! the names are not repeatn" );
}
else
{
printf( "nyou repeat namesn" );
}           
}
return 0;
}

程序输出为

great! the names are not repeat
you repeat names

或者,如果您的编译器不支持可变长度数组,则程序可能看起来像

#include <stdio.h>
#include <ctype.h>
#define M   3
#define N   10
int stringCmpi( const char *s1, const char *s2 )
{
while ( *s1 != '' && 
toupper( ( unsigned char )*s1 ) == toupper( ( unsigned char )*s2 ) )
{
++s1; ++s2;
}
return *s1 != *s2;
} 
int check( char names[][N], size_t m )
{
int unique = 1;
for (size_t i = 0 ; unique && i < m; i++ )
{
for ( size_t j = i + 1; unique && j < m; j++ )
{
unique = stringCmpi( names[i], names[j] );
}
}
return unique;
}
int main(void) 
{
{
char names[M][N] = { "Bob", "Tome", "David" };
if( check( names, M ) )
{
printf( "ngreat! the names are not repeatn" );
}
else
{
printf( "nyou repeat namesn" );
}           
}
{
char names[M][N] = { "Bob", "Tome", "Bob" };
if( check( names, M ) )
{
printf( "ngreat! the names are not repeatn" );
}
else
{
printf( "nyou repeat namesn" );
}           
}
}    

相关内容

  • 没有找到相关文章

最新更新