1

我正在尝试为我正在用 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);
}

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

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

4

4 回答 4

3

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

return only_letters(string, index+1);

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

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

于 2012-05-27T08:29:15.003 回答
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
于 2012-05-27T08:40:54.703 回答
0

在 ASCII 中,大写字母位于小写字母之前。第二个字符串的第一个字母是小写的“t”,ASCII 值为 116。另一方面,“Z”的 ASCII 值为 90,因此't' > 'Z'

ASCII(Z) == 90
ASCII(a) == 97
ASCII(t) == 116
于 2012-05-27T08:28:38.970 回答
0

尝试:

return only_letters(string, index+1); 
于 2012-05-27T08:30:48.077 回答