1
#include <stdio.h>
#include <math.h>
#include <stdlib.h>

int main(void)
{
    char wunit[2]; // weight unit
    char hunit[2]; // height unit

    double weight, height;

    printf("Enter the body weight: ");
    scanf("%lf%s", &weight, &wunit); // input weight and unit eg. 150lb

    printf("Enter the height: "); 
    scanf("%lf%s", &height, &hunit); // input height and unit eg. 5.65 ft

    printf("The height unit: %s\n", hunit);
    printf("The weight unit: %s", wunit);

    return 0;
}

このコードは、高さの単位のみを出力し、重量の単位は出力しません。それを修正するにはどうすればよいですか?

4

4 に答える 4

2

これらの2つの文字列に多くのスペースを許可していませんchar。それぞれに2つだけです。C文字列には、文字列の終わりを示すためのnull終了文字用のスペースも必要であることに注意してください。

ヌル終了文字を使用すると、2つの文字列はそれぞれ1つの文字のみを適切に保持できます。たとえば「lb」や「ft」と入力すると、配列の範囲外のデータを使用していることになります。配列のサイズを(少なくとも)3に変更し、コードが両方の単位を正しく出力するかどうかを確認します。

char wunit[3]; // weight unit
char hunit[3]; // height unit

あなたのコードは、より大きな配列で私にとってはうまく機能します。

于 2012-09-23T19:16:47.823 に答える
1

\n最後のステートメントにaがありませんprintf()。また、stdoutはおそらくバッファリングされているため、行末の画面にのみ書き込まれます。

于 2012-09-23T19:16:39.520 に答える
1

を使用%sすることは常に悪い考えです。scanf同じ理由で、それgetsは常に悪い考えです。固定バッファサイズを指定する必要があります。2つのうちのyoursはとてつもなく小さいですが、より一般的には、入力ストリームに含まれる文字数を制御できないため、プログラムはバッファオーバーフローの影響を受けやすくなります。

これを修正するいくつかの方法:

  • ある程度の長さのプレフィックス%s、つまり「%2s」。これにより、コピーされる文字の量が最大になります。

  • 行全体を文字列バッファに読み込むために使用fgetsします(任意の最大値を使用)。次に、読み取りたい値にいくつかの境界があります%s。あなたもsscanfそれを行うために使用することができます。

  • readline行を読み取るために任意の量の文字を割り当てるようなものを使用します。

于 2012-09-23T19:19:41.007 に答える
1

2文字の配列内に2文字の文字列を入れようとしているからです。文字列は常に「\0」で終わる必要があるため、次のようにする必要があります。

char wunit[3]; // weight unit
char hunit[3]; // height unit

たとえば、wunit配列は次のようになります:['l'、'b'、0]

于 2012-09-23T19:19:45.400 に答える