-1

宿題に苦労し、私の人生のために、これを理解することはできません. 疑似論理は

 printf("Enter a string\n");

次に、ループを実行して、文字列が 10 文字を超えているかどうかを確認します。10 文字未満の文字列を入力するよう再プロンプトが表示されない場合。

4

2 に答える 2

1

あなたの問題について具体的な質問をして、これまでの試みを私たちに提供してください。そうでなければ、Cの理解について仮定を立てる必要があり、そのような仮定は不快に見えるかもしれません。

ユーザーがキーボードを使用して「\0」文字を入力することは期待できないため、「文字列」がstdinから来る可能性があるというこの考えはばかげているように思われます。ユーザーがこの「\0」キーを押す前に、何バイトを読み取る必要がありますか?せいぜい10。で始まり、x = 0;その間続くループを記述しますx < 10。ループは次の場合に中断する必要がありgetchar() == '\0'ます。ループの外側で、xをテストします。xが10に達すると、ループは「\0」に入る前に終了しました。ユーザーに新しい文字列の入力を求めます。

おそらく、先生は他の文字を端末文字として使用し、結果を配列に格納することを望んでいます(この場合、「\ 0」は末尾に関連しないため、入力は実際には文字列ではありません)。上記のプログラムを作成したら、それを適応させることができます。

于 2013-02-17T04:16:35.437 に答える
0

全体的な目標に応じて、これを行うには複数の方法があります。

char input[11];

if (scanf("%10s", input) != 1)
    ...error...
...here, the string is not longer than 10 characters, and contains no white space...

より多くの文字を入力できるようにしてから文句を言うことに決めた場合、またはスペースを入力できるようにする必要がある場合は、次のようにします。

char input[4096];

while (1)
{
    printf("Enter a string\n");
    if (fgets(input, sizeof(input), stdin) == 0)
        break;  // EOF or error
    size_t len = strlen(input);
    if (len > 0)
        input[--len] = '\0';   // Zap newline
    if (len <= 10)
        break;
 }

これにより、ループでプロンプト、読み取り、切り捨て、検証が行われます。ループを終了するときに、EOF またはエラーと有効な入力をどのように区別するかを考える必要がある場合があります。これは、入力に使用するバッファを渡される関数内にコードが実際にある場合に最も簡単に実行できます。

int prompt_for_string(const char *prompt, char *buffer, size_t buflen)
{
    while (1)
    {
        printf("%s", prompt);
        if (fgets(buffer, buflen, stdin) == 0)
            return EOF;
        size_t len = strlen(buffer);
        if (len > 0 && buffer[len-1] == '\n')
            buffer[--len] = '\0';
        if (len <= 10)
            return len;
    }
    return EOF;
}

あなたが本当に決心しているなら、 or の代わりにorgetchar()の親戚の 1 つを使って入力ループを書くことができます。それは面倒で、明らかな利点はありません。fgets()scanf()

于 2013-02-17T05:00:48.273 に答える