1

我想在我的程序中添加双值验证。

例如:当用户输入字符串时,它会给出错误“请输入整数而不是字符串。”

我也想要“请输入一个整数而不是双精度值”。

我该如何应用这个?

/*
 * HW3-3.c
 *
 *  Created on: Oct 21, 2012
 *      Author: mert
 */


 #include <string.h>
 #include <stdio.h>

  void checkTriangle(char *s1,char *s2,char *s3)
  {
    int i;
    int found_letter = 0;
    int len = strlen(s1);
    int len2 = strlen(s2);
    int len3 = strlen(s3);

    for( i = 0; i < len; i++)
    {
        if(s1[i] < '0' || s1[i] > '9')
        {
            found_letter = 1; // this variable works as a boolean
            break;
        }
    }


    for( i = 0; i < len2; i++)
    {
        if(s2[i] < '0' || s2[i] > '9')
        {
            found_letter = 1; // this variable works as a boolean
            break;
        }
    }


    for( i = 0; i < len3; i++)
    {
        if(s3[i] < '0' || s3[i] > '9')
        {
            found_letter = 1; // this variable works as a boolean
            break;
        }
    }

    if(found_letter) // value 0 means false, any other value means true
        printf("Please enter an integer instead of string.");
    else
    {
            int side1 = atoi(s1);
            int side2 = atoi(s2);
            int side3 = atoi(s3);

            if ((side1 + side2 > side3 && side1 +  side3 > side2 && side2 + side3 > side1) && (side1 > 0 && side2 > 0 && side3 > 0))
                 {
                // Deciding type of triangle according to given input.
                  if (side1 == side2 && side2 == side3)
                      printf("EQUILATERAL TRIANGLE");
                  else if (side1 == side2 || side2 == side3 || side1 == side3)
                      printf("ISOSCELES TRIANGLE\n");
                  else
                      printf("SCALENE TRIANGLE \n");
                }
                 else
                     printf("\nTriangle could not be formed.");
    }
  }


  int main(void)
  {

      char s[32], s2[32], s3[32];

      printf("Please enter sides of triangle");
      printf("\nPlease enter side 1:");
      gets(s);
      printf("Please enter side 2:");
      gets(s2);
      printf("Please enter side 3:");
      gets(s3);

      checkTriangle(s,s2,s3);
  }
4

2 回答 2

2

您可以尝试解析输入并检查结果。另请注意,使用通用函数而不重复验证三次很方便:

/*
    Returns a positive integer if a positive integer was read from input.
    It will return -1 if the input is not a number,
    -2 if it was not an integer,
    -3 if it was not strictly positive.

    Bugs: "-0" is recognized as "not a number" instead of "not positive"
          "0185" is recognized as 185 instead of "not a (proper) number"
*/

int askValue(char *message)
{
    int val;
    char s[32];
    printf("%s: ", message);

    // Read string
    fgets(s, sizeof(s), stdin);

    // Trim string. fgets will return the \n.
    if (0 == strlen(s))
        return -1;
    s[strlen(s)-1] = 0x0;

    // Parse as an integer. 0 means it was either "0", or garbage
    if (0 == atoi(s))
    {
        if ('0' == s[0])
            val = 0; // It was a "0" (or maybe "0.17" or "0x18")
        else
            return -1; // Error: it was not a number
    }
    // Then parse as a float. "0.17" will give 0.17 which is not 0.00
    if ((double)val != atof(s))
    {
        // Error: the string checks as a floating point value
        return -2;
    }
    if (val <= 0)
        return -3;
    return val;
}

void complain(int val)
{
    switch(val)
    {
        case -3: printf("Value must be greater than 0\n"); break;
        case -2: printf("Value must be integer\n"); break;
        case -1: printf("Value must be a number\n"); break;
    }
}

int main()
{
    int side1, side2, side3; // We could use a vector: side[3]

    while ((side1 = askValue("Please enter side 1")) < 0)
        complain(side1);
    while ((side2 = askValue("Please enter side 2")) < 0)
        complain(side2);
    while ((side3 = askValue("Please enter side 3")) < 0)
        complain(side3);

    ...
}

这是一个不同的实现,更严格。如果它是正整数,则返回整数值,如果是负整数则返回 -2,在所有其他情况下(垃圾和浮点数)返回 -1。

它仍然对“-0”有误报,解析为“0”。

int askValue(char *message)
{
    int val;
    char s[32], c[32];
    printf("%s: ", message);

    // Read string
    fgets(s, sizeof(s), stdin);

    // Parse as an integer. 0 means it was either "0", or garbage
    val = atoi(s);

    // Now produce the expected input for val, included final \n
    snprintf(c, sizeof(c), "%d\n", val);

    if (strcmp(c, s))
        return -1;
    if (val < 0)
        return -3;
    return val;
}
于 2012-10-21T12:38:18.600 回答
0

在遍历每个字符时,您可以简单地检查是否有任何数字是.. 如果你找到一个,那么输入是双精度的。

  void checkTriangle(char *s1,char *s2,char *s3)
  {
    int i;
    int found_double = 0;
    int found_letter = 0;
    int len = strlen(s1);
    int len2 = strlen(s2);
    int len3 = strlen(s3);

    for( i = 0; i < len; i++)
    {
        if(s1[i] < '0' || s1[i] > '9')
        {
            found_letter = 1; // this variable works as a boolean
            break;
        } else if (s1[i] == '.') {
            found_double = 1;
            break;
        }
    }


    for( i = 0; i < len2; i++)
    {
        if(s2[i] < '0' || s2[i] > '9')
        {
            found_letter = 1; // this variable works as a boolean
            break;
        } else if (s2[i] == '.') {
            found_double = 1;
            break;
        }
    }


    for( i = 0; i < len3; i++)
    {
        if(s3[i] < '0' || s3[i] > '9')
        {
            found_letter = 1; // this variable works as a boolean
            break;
        } else if (s3[i] == '.') {
            found_double = 1;
            break;
        }
    }

    if(found_letter) // value 0 means false, any other value means true
        printf("Please enter an integer instead of string.");
    else if (found_double)
        printf("Enter an integer, not a double");
    else {
        // code stays the same
    }
于 2012-10-21T12:20:09.707 回答