1

C で記述している大規模な割り当てのための単純な関数を記述しようとしています。関数の目的は、文字列に小文字または大文字のみが含まれているかどうかを判断し、文字列のサイズ (\0 のインデックス) を返すことです。テストに合格した場合は-1、そうでない場合は-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);
}

これを実行すると、最初の文字列 (無効であると想定される) と、有効であると想定される 2 番目の文字列の両方で -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 では大文字が小文字の前に来ます。2 番目の文字列の最初の文字は小文字の「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 に答える