我不明白为什么这个简单的递归函数在C中不起作用

时间:2012-05-27 08:26:31

标签: c

我正在尝试编写一个简单的函数,用于我在C中编写的更大的作业。 该函数的目的是确定字符串是否仅包含小写字母或大写字母,并在通过测试时返回字符串的大小(索引为\ 0),如果不通过则返回-1。 这就是我写的:

 #include <stdio.h>

int only_letters(char string[], int index);

void main() {
    char string1[]="Hi my name is pete";
    char string2[]="thisissupposedtobevalid";

    printf("the first string is %d and the second one is %d\n",only_letters(string1,0),only_letters(string2,0));

}

int only_letters(char string[], int index){
    if(!string[index]) return index;
    if(string[index]<'a'||string[index]>'Z') return -1;
    only_letters(string, index+1);
}

当我运行这个时,我得到的是第一个字符串(它应该是无效的),但也是第二个字符串,它应该是有效的。

(我们不允许使用循环,我们还有十几个其他限制,所以请不要提供更简单或更简单的解决方案,我知道它们存在,但我试图理解为什么我写的不起作用。 )

4 个答案:

答案 0 :(得分:3)

请打开您的编译器警告,在默认情况下,您不会从该函数返回任何内容。

return only_letters(string, index+1);

其他问题是你的范围倒置了。大写字母的ASCII值低于小写字母。

并且main必须返回int。不是void

答案 1 :(得分:1)

这一行也存在问题:

if(string[index]<'a'||string[index]>'Z') return -1;

在ASCII表中,首先是大写字母,后面是几个非字母符号,然后是小写字母。该行看起来应该更像:

char l = string[index];
if(!((l >= 'A' && l <= 'Z') || (l >= 'a' && l <= 'z'))) return -1

答案 2 :(得分:0)

大写字母在ASCII中以小写字母开头。第二个字符串的第一个字母是一个小写的't',其ASCII值为116.另一方面,'Z'的ASCII值为90,因此't' > 'Z'

ASCII(Z) == 90
ASCII(a) == 97
ASCII(t) == 116

答案 3 :(得分:0)

尝试:

return only_letters(string, index+1);