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

/* Function prototypes */
void wordLength ( char *word );

int main (void)
{
    int choice;
    char word [20];

    printf( "Choose a function by enterting the corresponding number: \n"
        "1) Determine if words are identical\n"
        "2) Count number of words in sentence provided\n"
        "3) Enter two strings to be strung together\n"
        "4) Quit program\n" );
    scanf( "%d", &choice );
    flushall();

    while (choice >= 1 && choice < 4) 
    {
        /* if statements for appropriate user prompt and calls function */
        if (choice == 1) 
        {
            /* gather user input */
        printf( "\nYou have chosen to determine word length.\n"
                "Please enter the word:\t");
            gets( word );

            /* call function to output string as well as the string length */
            wordLength( word );

        }
    }
}

void wordLength( char *word )
{
    printf( "The string entered is:  %c\n", *word);
}

単語を入力するたびに、プログラムは文字列の最初の文字のみを出力します。なぜこれを行うのですか?私の文字列の長さは 20 と宣言されているので、それが問題ではないことはわかっています! 私はそれを理解できないようです。ありがとう!

4

4 に答える 4

6

1文字を印刷するように指示したため:

printf("The string entered is: %c\n", *word);

文字列が必要な場合は、次を使用します。

printf("The string entered is: %s\n", word);
于 2012-11-11T21:51:24.660 に答える
2
void wordLength( char *word )
{
    printf( "The string entered is:  %c\n", *word);
}

wordLength関数では、フォーマット指定子として使用し%cています。 %c1文字を印刷するために使用されます。%s文字列を印刷するために 使用します。

また、*wordをwordに変更します。* wordは、配列の最初の値または「zeroeth」値(1文字)を参照します。

アスタリスクのないパラメータ「word」は、&word[0]として表すこともできる配列全体を参照します。つまり、それはゼロ番目の要素のアドレスです。

要約すると...%sは配列のアドレスを期待し、&はアドレスを指定し、[0]はゼロ番目の要素を指定します。&および対応する配列括弧[]のない変数は同等です。したがって、「&word[0]」は「word」と同じです。これは、&word[10]などのゼロ番目の要素ではない要素のアドレスを指定する必要がある日までは無意味に思えるかもしれません。たとえば、文字列が「ジャガイモ鍋オーティスに座る」で、文字列から「オーティス」という単語を引き出したい場合です。

%cは単一の文字を想定しており、アスタリスクはポインターを「逆参照」するため、* wordは文字のアドレスではなく、実際の文字を参照します。

それを視覚化するために、おそらくあなたの祖父が彼の薬のために使用した種類のピルボックスを想像してください。ピルボックスは文字の配列を表します。7つの小さなコンパートメントがあり、それぞれが日曜日から土曜日までの曜日ごとにラベルが付けられています。したがって、配列は0から6になります。最初のコンパートメントは文字列の先頭です。日曜日は、文字配列の0番目の要素のアドレスです。

日曜日のコンパートメントを開くと、中の丸薬が手に入ります。これが「価値」です。日曜日は&word [0]として表され、月曜日は&word[1]として表されます。日曜日のコンパートメント内の値(ピル)が必要な場合は、*wordを指定します。配列全体を文字列として(%s形式指定子にフィードするために)必要な場合は、&word[0]または単なる「word」を指定できます。これらは同等であるためです。2番目の文字から始まる文字列を印刷する場合は、&word[1]を指定します。月曜日のコンパートメント内の値が必要ですか?*(word + 1)を使用し、文字の場合は%cを使用して印刷します。私はあなたのために物事を明確にしたと思います。

于 2012-11-11T21:51:56.657 に答える
2

文字のみを出力する修飾子として%cを使用しています。%sを使用する必要があります。println修飾子を確認してください。

于 2012-11-11T21:53:05.477 に答える
0

使用する必要がある場合は、これを使用して文字ごとに印刷できます。

for( i = 0; i < 20; i++ ){
    printf( "%c", *( word + i ) );

    /* If you reach the end of the string, print a new line and stop. */
    if( *( word + i ) == '\0' ){
       printf( "\n" );
       break;
    }
}
于 2012-11-11T22:20:22.667 に答える