0

OR 条件ステートメントを追加すると、このループは終了しません。いずれかが false の場合、終了する必要があります。

//グローバル変数

int x = 100;
    char *n= malloc (64);

void add(void)
{       

    do      
    {
        printf("Would you like to add 1? (y/n) ");
        fgets(n, 64, stdin);
            //removes newline
        n[strlen(n)-1] = '\0';
            x++;
    }       
//if I add || (x!=100) it keeps looping me even if I press "n"
//otherwise without it it works fine

        while((strncmp(n, "n", 1) != 0) || x!=100 );

        free(n);
}
4

5 に答える 5

3

あなたのループの一番下で、あなたはやっていx++ます。while 条件にヒットするとx == 101、ループが終了するxことはなく、条件がチェックされているときに 100 に等しくなることはありません。

おそらくあなたが望んでいた:

while((strncmp(n, "n", 1) != 0) && x != 100);

2 つの条件のいずれかが false の場合、ループは終了します。

&&は「論理 AND」演算子、||は「論理 OR」演算子です。追跡しやすくするために、真理値表を使用して詳細を整理できます。論理 and は論理積と同じであり、論理 or は論理和と同じです。

于 2012-08-24T18:04:07.857 に答える
2

ループは、条件全体が、または truewhileと評価される限り実行されます。がnever1の場合、オペランドの 1 つが true であるため、条件の論理 OR は常にtrue になります。x 100

xは から始まり100、ループのたびに をインクリメントしますx。したがってx、ループ条件でテストする前は、100 よりも大きく (101 です)、常に増加しています。

于 2012-08-24T18:04:05.503 に答える
1

ループを終了するために数値の等価性をチェックすることは、通常は悪い考えです。などの値の範囲を確認したいx < 100

したがって、古典的なforループ テストは is i < nand noti != nです。

変数がブール型の場合にのみループを終了します。

于 2012-08-24T18:22:17.640 に答える
0

条件x!= 100がfalseになることはありません。これは、最初のdo whileが実行されたときにxがすでに101にインクリメントされているため、ステートメントをfalseにするには、||の代わりに&&を使用する必要があります。

于 2012-08-24T18:26:08.643 に答える