我正在尝试编写一个简单的函数,用于我在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);
}
当我运行这个时,我得到的是第一个字符串(它应该是无效的),但也是第二个字符串,它应该是有效的。
(我们不允许使用循环,我们还有十几个其他限制,所以请不要提供更简单或更简单的解决方案,我知道它们存在,但我试图理解为什么我写的不起作用。 )
答案 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);