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

如果您希望能够检测到用户输入的错误,例如行不是有效的十进制整数,那么您可以执行以下操作:

  • 使用将输入读入缓冲区fgets(buffer, size, stdin)
  • 用于strtoul(buffer, &endptr, 10)将缓冲区解析为十进制整数(以10为底),其中endptrchar*
  • endptr将指向 中的第一个无效字符buffer,即。最后一个成功解析的字符之后的字符
  • 现在如果*endptr == '\0',即。endptr指向结尾buffer整个字符串被解析为有效的十进制整数
于 2012-10-15T05:29:32.817 回答
1

如果您真的希望每个数字在单独的输入行上,并且整行都是有效的数字或空格,那么您可能需要忘记scanf()和家人并使用fgets()andstrtol()代替。

#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()et al 做同样的工作。特别是,溢出的行为scanf()是未定义的。

于 2012-10-15T05:32:47.363 回答
0

%d只接受整数。尝试%x在 scanf() 中进行十六进制输入。

更好的是,您可以将输入作为字符串获取,然后使用@mou 建议的isnumeric()else 使用进行检查。scanf("%[^\n]s", word)

于 2012-10-15T05:12:34.417 回答
0

你不应该使用 scanf 或做 scanf("%[^\n]s", word); 或者使用 get() 之类的东西,也将 d 或 x 放在我的示例末尾,而不是 s 用于字符串:P

于 2012-10-15T05:17:03.940 回答
0

将输入读入字符串缓冲区。解析字符串以逐一提取任何类型的数值。

于 2012-10-15T05:18:42.877 回答