我想写一个递归函数,它获取一个字符串指针并返回int
;如果字符串按字母顺序排列,则应返回1,如#34; abbcdj",否则返回0。
int CheckS(char *string)
{
if (string == NULL)
return 1;
if (strncmp(string, string + 1, 1) >= 0)
CheckS(string + 1);
else
return 0;
}
但它并不像它应该的那样有效。我的想法是拿一封信和下一封信,然后按字母顺序检查下一个是否是先前的;我也检查了这个
if (string-(string+1)>=0)
CheckS(string + 1);
但没有结果。
答案 0 :(得分:1)
您的编译器应该抱怨您的函数并不总是返回值。它不会保护自己免受空字符串的影响(尽管它确实处理空指针,这通常很好),并且它错误地处理了最后一个非空字节与字符串中的尾随空字节的比较。另外,我认为您的比较使用了错误的符号。使用您的技术,您可以写:
int CheckS(char *string)
{
if (string == NULL || *string == '\0' || *(string + 1) == '\0')
return 1;
if (strncmp(string, string + 1, 1) <= 0)
return CheckS(string + 1);
else
return 0;
}
如果strncmp()
在*string
之前,*(string + 1)
函数将返回负值;如果字符相等则为零;如果*string
大于*(string + 1)
,则为正值。但是,写起来会更直接:
int CheckS(char *string)
{
if (string == NULL || string[0] == '\0' || string[1] == '\0')
return 1;
if (string[0] <= string[1])
return CheckS(string + 1);
else
return 0;
}
请注意,这不会拒绝或忽略非字母字符,也不会在比较之前对其进行大小写转换。这可以被视为GIGO - Garbage In,Garbage Out。
另请注意,我将'递归函数'作为一项要求,即使敏感代码是迭代的,也不是递归的。该函数使用尾递归的形式,它可以简单地转换为迭代。
答案 1 :(得分:0)
如果您没有尝试使用strncmp
,而只是比较接下来的两个字符会更容易。您可以使用operator[]
访问各个字符,如下所示:
string[0] >= string[1]