0

これは私に問題を与えている私の小さなスニペットです:

int main(int argc, char** argv) {

char string[75] = {0};
char *pChar;
int count = 0;

printf("String: ");
fgets(string, sizeof string, stdin);

printf("Numero parole: %d\n", countWords(string, strlen(string)));

// Suddivido la stringa nelle varie parole
pChar = strtok(string, " ");
while(pChar){
    if(isWord(pChar, strlen(pChar))){

        count += strlen(pChar);

    }
    pChar = strtok(NULL, " ");

}

printf("Lettere totali: %d\n", count);

return (EXIT_SUCCESS);

}

問題は、カウント変数に値が割り当てられていないことです。何かが間違っていることはわかっていますが、何が間違っているのかまだわかりません。

助けてくれてありがとう^^

PS私は現在Cを学んでいるので、これはおそらくばかげた質問です。

PPS リクエストされた isWord 関数は次のとおりです: (イタリア語のコメントは気にしないでください)

// Controlla se è una parola
int isWord(char string[], int length){

int i = 0;                  // Contatore
int countAlpha = 0;         // Se il carattere è alfabetico. Non vengono
                            // contate le parole che contengono numeri

// Inizio scorrendo tutta la stringa tranne l'ultimo carattere che è un
// terminatore di stringa
for(i; i < length - 1; i++){

    // Se il carattere è alfabetico allora aumento il contatore isAlpha
    if(isalpha(string[i])){

        countAlpha++;

    // Altrimenti il carattere non è una lettera
    } else {

        countAlpha = 0;

    }

}

if(countAlpha == i){

    return 0;

} else {

    return 1;

}

}

4

3 に答える 3

1

が増加していない場合countは、次のいずれかが原因です。

a) strlen(pChar);0 を返します

b)if(isWord(pChar, strlen(pChar)))決して真実ではない

c)while(pChar)決して有効ではない

対話型デバッガーを使用して、実行時にコードを 1 行ずつステップ実行することで、機能しているものと機能していないものを検証できます。

これが最初に投稿されてからの追加の変更に基づいて、問題はあなたのisWord機能にあるようです。関数が意図した値とは逆の値を返しているようです。if(countAlpha == i)が 1 (真の場合) をelse返し、 が 0 (偽の場合) を返すように変更します。

于 2012-05-22T16:21:27.340 に答える
0

小さなスニペットには、コードの説明が含まれている可能性があります:)

ちなみに、他の人が指摘しているように、問題は関数の戻り値にありますがisWord、もっと重要なのは、なぜすべての作業を行っているのですか?

この関数isWordは、単語がすべてのアルファベットで構成されている場合にカウントされることになっています。もしそうなら成功コードを返し、そうでなければ失敗コードを返します。成功した場合のメイン関数strlenは、文字列のカウントをインクリメントします。

しかし、これはすべて必要ですか?

提案された変更:エラーコードまたは成功コードを返す代わりに、成功時と失敗時の合計文字数を返し、strlenそれに応じて増分します。これにより、関数呼び出しを節約できます:)isWord-1countstrlen

これははるかに良いようです:)同意しませんか?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int isWord(char string[], int length){

int i = 0,countAlpha = 0;

for(; i < length - 1; i++){

    if(!isalpha(string[i])){

        countAlpha = -1;
        break;

    }else {

        countAlpha++;

    }

}

return countAlpha;

} 

int main(int argc, char* argv[]){

char string[75] = {0};
char *pChar;
int ret = 0,count = 0;

printf("String: ");
fgets(string, sizeof string, stdin);

// Suddivido la stringa nelle varie parole
pChar = strtok(string, " ");

while(pChar){

    if( (ret=isWord(word, strlen(word))) != -1){

        count += ret;

    }

    pChar = strtok(NULL, " ");  

}

printf("Lettere totali: %d\n", count);

return 0;
}
于 2012-05-23T18:40:24.213 に答える
0

fgets は改行文字を格納する可能性があるため、 isalpha('\n') が false であるため、isWord は false を返します。

于 2012-05-22T16:25:54.440 に答える