0

私はcで三角形のプログラムを持っています

#include <stdio.h>

// A function which decides the type of the triangle and prints it
void checkTriangle(int s1, int s2,int s3)
{
    // Check the values whether it is triangle or not.
    if ((s1 + s2 > s3 && s1 +  s3 > s2 && s2 + s3 > s1) && (s1 > 0 && s2 > 0 && s3 > 0))
    {
        // Deciding type of triangle according to given input.
        if (s1 == s2 && s2 == s3)
            printf("EQUILATERAL TRIANGLE");
        else if (s1 == s2 || s2 == s3 || s1 == s3)
            printf("ISOSCELES TRIANGLE\n");
        else
            printf("SCALENE TRIANGLE \n");
    }
    else
        printf("\nTriangle could not be formed.");
}

int main(void)
{
    // Initializing variables
    int a,b,c;

    // Getting input from user
    printf("Please enter the sides of triangle");

    printf("\nPlease enter side 1:");
    scanf("%d",&a);

    printf("Please enter side 2:");
    scanf("%d",&b);

    printf("Please enter side 3:");
    scanf("%d",&c);

    // Calling function in order to print type of the triangle.
    checkTriangle(a,b,c);
}

入力が次の場合:

7b

エラーが発生しますが、これは私が望むものですが、次のようにデータを入力すると:

7
7
7b 

'b' を無視し、整数として 7 を取ります — しかし、なぜでしょうか? どうすればこれを防ぐことができますか?

私がやりたいのは、エラーを出すことです

7
7
7b
4

5 に答える 5

3

行が有効な 10 進整数ではないなど、ユーザーの入力に関するエラーを検出できるようにする場合は、次のようにします。

  • を使用して入力をバッファに読み込みますfgets(buffer, size, stdin)
  • strtoul(buffer, &endptr, 10)バッファーを 10 進整数 (基数10 )として解析するために使用しますendptrchar*
  • endptrの最初の無効な文字を指しますbuffer。正常に解析された最後の文字の後の文字
  • 今なら*endptr == '\0'、つまり。の末尾をendptr指しています。文字列全体が有効な 10 進整数として解析されましたbuffer
于 2012-10-15T05:29:32.817 に答える
1

それぞれの数値を別々の入力行に入れ、行全体を有効な数値またはスペースにしたい場合は、おそらく and を忘れて、代わりに and を使用する必要がありscanf()ます。fgets()strtol()

#include <stdlib.h>
#include <errno.h>
#include <stdio.h>
#include <ctype.h>
#include <limits.h>

static int read_side(void)
{
    char buffer[4096];
    if (fgets(buffer, sizeof(buffer), stdin) == 0)  // EOF
        return -1;
    char *end;
    errno = 0;
    long result = strtol(buffer, &end, 10);
    if (result < 0 || errno != 0) // Neither errors nor negative numbers are allowed
        return -1;
    if (end == buffer)     // Nothing was convertible
        return -1;
    while (isspace(*end))
        end++;
    if (*end != '\0')      // Non-spaces after the last digit
        return -1;
    if (result > INT_MAX)  // Result too big for `int`
        return -1;
    return result;
}

(有効な値を受け入れる必要intがあるがエラーを区別する必要がある場合は、関数へのポインターを渡し、エラーの場合は -1 を返し、成功の場合は 0 を返し、安全な結果をポインターに割り当てます。)

はい、仕事を適切に行うのは本当に面倒です。はい、結果の分析はstrtol()それと同じくらいトリッキーです。あなたは非常に注意する必要があります。scanf()(そして、検出可能なエラー状態をチェックするのを忘れた外部の可能性があります。) いいえ、等と同等の仕事をすることができるとは思いません。特に、オーバーフロー時の動作scanf()は未定義です。

于 2012-10-15T05:32:47.363 に答える
0

scanfを使用したり、scanf( "%[^ \ n] s"、word);を実行したりしないでください。または、get()のような何かを使用して、文字列:Pの場合はsではなくdまたはxを例の最後に配置します

于 2012-10-15T05:17:03.940 に答える
0

入力を文字列バッファに読み込みます。文字列を解析して、任意の種類の数値を1つずつ抽出します。

于 2012-10-15T05:18:42.877 に答える
0

%d整数のみを受け入れます。%x16進10進入力の場合はscanf()で試してください。

文字列として入力を取得してから、@mouが提案するようにelseuseをisnumeric()使用して確認することをお勧めします。scanf("%[^\n]s", word)

于 2012-10-15T05:12:34.417 に答える