如何使此代码工作(isdigit)

时间:2015-06-05 05:53:41

标签: c numbers

所以,我正在创建一个计算三角形区域的程序,我需要它告诉用户他输入了一个字母还是一个负数,按顺序,我创建了代码: 我需要使用isdigit

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

int main () {
    float a, b, c;
    float s=0, ar1=0, ar2=0;
    printf("Inform the value of side A.");
    fflush(stdin);
    scanf("%f",&a);
    while(a<=0||isdigit((int)a)){
        printf("Invalid value.");
        fflush(stdin);
        scanf("%f",&a);
    }printf("Inform the value of side B.");
    fflush(stdin);
    scanf("%f",&b);
    while(b<=0||isdigit((int)a)){
        printf("Invalid value.");
        fflush(stdin);
        scanf("%f",&b);
    }printf("Inform the value of side C.");
    fflush(stdin);
    scanf("%f",&c);
    while(c<=0||isdigit((int)a)){
        printf("Invalid value.");
        fflush(stdin);
        scanf("%f",&c);}
         s=((a+b+c)/2);
        ar1=(s*(s-a)*(s-b)*(s-c));
        ar2=pow(ar1,0.5);
   printf("The semiperimeter is %f",s);
   printf("The area of the triangle is%f",ar2);
   system ("pause");
   return 1;
}

但是,当我编译/运行它时,键入&#34; x&#34;或&#34; blabla&#34;当我打算键入数字时,没有任何反应,程序也没有警告我,我该怎么办?

1 个答案:

答案 0 :(得分:1)

首先,在fflush上使用stdin是根据C11标准的未定义行为,尽管在某些实现中已经明确定义。

其次,您不能以这种方式使用isdigit。一旦%f看到无效数据(如字符),scanf就会终止,相应的参数不会受到影响。此外,对未初始化的变量使用isdigit会导致未定义的行为。

您可以做的是检查scanf的返回值。如果成功,代码中的所有三个scanf都会返回1。

固定代码:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <ctype.h> //Unused header


void flushstdin() //Removes all characters from stdin
{
    int c;
    while((c = getchar()) != '\n' && c != EOF); //Scan and discard everything until a newline character or EOF
}

int main () {

    float a, b, c;
    float s=0, ar1=0, ar2=0;

    printf("Inform the value of side A\n");
    //fflush(stdin); Avoid this to make your code portable
    while(scanf("%f",&a) != 1 || a <= 0){
        printf("Invalid value\n");
        flushstdin(); //Alternative way to flush stdin
    }

    printf("Inform the value of side B\n");
    //fflush(stdin);
    while(scanf("%f",&b) != 1 || b <= 0){
        printf("Invalid value\n");
        flushstdin(); //Alternative way to flush stdin
    }

    printf("Inform the value of side C\n");
    //fflush(stdin);
    while(scanf("%f",&c) != 1 || c <= 0){
        printf("Invalid value\n");
        flushstdin(); //Alternative way to flush stdin
    }

    s=((a+b+c)/2);
    ar1=(s*(s-a)*(s-b)*(s-c));
    ar2=pow(ar1,0.5);

    printf("The semiperimeter is %f\n", s);
    printf("The area of the triangle is %f\n", ar2);
    system ("pause");
    return 0; // 0 is usually returned for successful termination
}

另外,最好在printf中的字符串末尾添加换行符,如上面的程序所示。它们

  • 提高可读性
  • 刷新标准输出