首先,该函数的逻辑是错误的。
通常这样的函数应该返回
1
(或正值),对应于逻辑上的
true
或
0
,对应于逻辑上的
false
,当它回答像“是或否”的问题时。
此调用
strcmp(string, "OH")
如果两个字符串相等,返回0。否则,该函数可以返回任何正数或负数,具体取决于第一个字符串是大于还是小于第二个字符串。
除此之外,函数参数应该有限定符const
,因为传递的字符串在函数内部不会被更改。
您没有预留内存来读取字符串。声明的指针
char *string;
变量未初始化且其值不确定。因此,此调用
gets(string);
调用未定义的行为。
请注意,函数gets
是一种不安全的函数,不受C标准支持。相反,您应该使用标准的C函数fgets
。
如果函数更通用将会更好。也就是说,它可以检查任何提供的字符串后缀。始终尝试编写更通用的函数。在这种情况下,它们可以重复使用。
下面是一个演示程序,展示了如何定义该函数。
#include <stdio.h>
#include <string.h>
int hydroxide( const char *s, const char *suffix )
{
size_t n1 = strlen( s );
size_t n2 = strlen( suffix );
return !( n1 < n2 ) && strcmp( s + n1 - n2, suffix ) == 0;
}
int main(void)
{
enum { N = 100 };
char s[N];
while ( 1 )
{
printf( "Enter a String (empty string - exit): " );
if ( fgets( s, N, stdin ) == NULL || s[0] == '\n' ) break;
s[ strcspn( s, "\n" ) ] = '\0';
printf( "%s\n", hydroxide( s, "OH" ) ? "true" : "false" );
}
return 0;
}
程序的输出可能看起来像这样:
Enter a String (empty string - exit): brogrammerOH
true
Enter a String (empty string - exit):