1

このコード行に関して質問があります。

scanf("%s %s %s", &op, &s1, &s2);
opPtr = &op;
s1Ptr = &s1;
s2Ptr = &s2;

if (strcmp(opPtr, "^") == 0 && (strcmp(s1Ptr, "A") == 0) && (strcmp(s2Ptr, "") == 0))
    matrix_transpose(matA, ArowsPtr, AcolsPtr);

scanf(op, s1, s2)の目的は、ユーザーに 2 つの行列 (s1 と s2) に対する操作と、それらに対する操作 (op) を入力してもらうことです。これには op = "*" || が含まれます。"+" || "^" ここで "^" は転置です。

転置の場合、s1 のみが必要です。したがって、ユーザーは「^ A[ENTER]」と入力し、matA、ArowsPtr、および AcolsPtr が matrix_transpose 関数に呼び出されます。

私の問題は、入力された操作が '^' のときに s2Ptr を無視する方法がわからないことです。s2Ptr を空の文字列に設定し、'\n' を strcmp(s1Ptr, "A\n") == 0 に追加しようとしましたが、s2 を無視するのには役立ちません。

ある種の while(EOF) を作成する必要があると思います。

4

1 に答える 1

0
scanf("%s %s %s", &op, &s1, &s2);

&op&s1およびのタイプのため、この行は明確に定義できません&s2scanfそれらは によって s であることが期待されていますchar *が、それが起こる唯一の方法は ifops1あり、s2次のように宣言されています: char op, s1, s2;. これは、入力フィールドがせいぜいゼロ文字であることを意味します。

より可能性が高いのは、 を宣言しており、op次のように宣言されていることです。つまり、 、 、 の型はです。これらのポインターは同じ場所を指している場合がありますが、同じ表現である必要はありません。システム上でそれらが同じ表現を持っているのは偶然です。移植性を重視する場合は、配列がサイレントにポインターに変換されることを理解し、代わりに次のようなものを使用します。s1s2char op[max], s1[max], s2[max];&op&s1&s2char (*)[max]

/* TODO: Handle errors from scanf! */
assert(scanf("%s %s %s", op, s1, s2) == 3);

scanfフォーマット文字列のスペースを「できるだけ多くの空白文字を読み取る」と解釈します。'\n'空白としてカウントされます。したがって、「^ A\n」を stdin に入力すると、2 つの単語scanfを読み取って保存し、3 つ目の単語を待機しています。これは、3 番目を無視できないように見える理由を説明している可能性があります。おそらく、自分の単語の 1 つを読んで、あと何回検索するかを決定する前に、それopが正しいかどうかを確認することができます。"^"例えば:

/* TODO: Handle errors from scanf! */
assert(scanf("%s", op) == 1);

if (strcmp(op, "^") == 0) {
    assert(scanf("%s", s1) == 1);
    if (strcmp(s1, "A") == 0) {
        matrix_transpose(matA, ArowsPtr, AcolsPtr);
    }
}
else {
    assert(scanf("%s %s", s1, s2) == 2);
    /* TODO: Do something with s1 and s2... */
}
于 2013-04-27T18:07:53.097 に答える