Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检查字符串是否按字母顺序在C中排序_C_String - Fatal编程技术网

检查字符串是否按字母顺序在C中排序

检查字符串是否按字母顺序在C中排序,c,string,C,String,我想编写一个递归函数,它获取字符串指针并返回int;如果字符串按字母顺序排列,如“abbcdj”,则应返回1,否则应返回0 int CheckS(char *string) { if (string == NULL) return 1; if (strncmp(string, string + 1, 1) >= 0) CheckS(string + 1); else return 0; } 但它并不像预期的

我想编写一个递归函数,它获取字符串指针并返回
int
;如果字符串按字母顺序排列,如“abbcdj”,则应返回1,否则应返回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);

但是没有结果。

如果您不尝试使用
strncmp
而只是比较接下来的两个字符,那就更容易了。您可以使用
操作符[]
访问单个字符,如下所示:

string[0] >= string[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;   
}
请注意,这不会拒绝或忽略非字母字符,也不会在比较之前对其进行大小写转换。这可以被视为GIGO-垃圾输入,垃圾输出


还要注意,我将“递归函数”作为一个需求,即使合理的代码是迭代的,而不是递归的。该函数使用的是一种尾部递归形式,可以轻松转换为迭代。

运算符[]
在C中?但是,这表明你在用C++思考。在C语言中,您可以编写“您可以使用
[]
运算符”,其中“运算符”一词绝对不在
code
字体中。
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;   
}