如何检查用户写的是否是一个字符?在C.

时间:2016-03-18 21:43:20

标签: c if-statement

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

int main() {
    char n;
    printf("Programma che svolge ogni tipo di operazione aritmetica tra 2 numeri a e b\n'n' per chiudere\nPremere 'invio' per continuare\n");
    double somma, differenza, prodotto, quoziente, a, b, resto;
    while (n = getchar() != 'n') {
        printf("Inserisci a\n");
        scanf("%lf", &a);
        if (isalpha(a)) {
            printf("Errore! non hai inserito un numero");
        }
        printf("Inserisci b\n");
        scanf("%lf", &b);
        if (isalpha(b)) {
            printf("Errore! non hai inserito un numero");
        }
        somma = a + b;
        differenza = a - b;
        prodotto = a * b;
        quoziente = a / b;
        resto = fmod(a, b);
        printf("somma = %.2lf + %.2lf = %.2lf\n", a, b, somma);
        printf("differenza = %.2lf - %.2lf = %.2lf\n", a, b, differenza);
        printf("prodotto = %.2lf * %.2lf = %.2lf\n", a, b, prodotto);
        printf("quoziente = %.2lf / %.2lf = %.2lf\n", a, b, quoziente);
        printf("resto = %.2lf %% %.2lf = %.2lf\n", a, b, resto);
        fflush(stdin);
    }
    return 0;
}

另一个问题(除了标题之外): 我如何(如果检查它)返回主函数(然后重新启动程序以进行while循环)?

1 个答案:

答案 0 :(得分:1)

您的计划有几个问题:

  • 您将c定义为charint应该是unsigned char以及特殊值EOF使用stdingetchar()读取字节。

  • 测试while (n=getchar()!='n')不会将字节红色存储到n,它会存储比较结果(getchar() != 'n')。要存储字节并测试其值,请使用while ((n = getchar()) != 'n')

  • isalpha()期望int的值为unsigned char或特殊值EOF,由getchar()返回。将double传递给不符合此约束的值会调用未定义的行为。如果要检查用户是否键入了数字,请检查scanf()的返回值:它应返回1.

  • 转换printf类型的double格式为%fl中的%lf会被忽略。

  • fflush(stdin);根据C标准调用未定义的行为。要阅读stdin的剩余部分,请使用scanf("%*[^\n]"), scanf("%*c");

以下是更正后的版本:

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

int main(void) {
    int n, res;
    double somma, differenza, prodotto, quoziente, a, b, resto;

    printf("Programma che svolge ogni tipo di operazione aritmetica tra 2 numeri a e b\n"
           "'n' per chiudere\nPremere 'invio' per continuare\n");

    while ((n = getchar()) != EOF && n != 'n') {
        printf("Inserisci a: ");
        while ((res = scanf("%lf", &a)) != 1) {
            printf("Errore! non hai inserito un numero\n");
            if (res == EOF)
                exit(1);
            scanf("%*[^\n]"), scanf("%*c");
        }
        printf("Inserisci b: ");
        while ((res = scanf("%lf", &b)) != 1) {
            printf("Errore! non hai inserito un numero\n");
            if (res == EOF)
                exit(1);
            scanf("%*[^\n]"), scanf("%*c");
        }
        somma = a + b;
        differenza = a - b;
        prodotto = a * b;
        quoziente = a / b;
        resto = fmod(a, b);
        printf("somma = %.2f + %.2f = %.2f\n", a, b, somma);
        printf("differenza = %.2f - %.2f = %.2f\n", a, b, differenza);
        printf("prodotto = %.2f * %.2f = %.2f\n", a, b, prodotto);
        printf("quoziente = %.2f / %.2f = %.2f\n", a, b, quoziente);
        printf("resto = %.2f %% %.2f = %.2f\n", a, b, resto);
        scanf("%*[^\n]"), scanf("%*c");
    }
    return 0;
}

注意:

  • scanf返回正确转换的格式数。它在文件末尾返回EOF。如果用户输入了无法转换为数字的内容,您的来电将返回0。如果你到达文件末尾,它将返回EOF。我将返回值存储到res,并将其与1进行比较。如果它等于1,则程序可以继续,如果不同,我打印错误消息,刷新剩余的行并重新开始输入操作,除非我们到达文件末尾,我们应该在哪里退出程序以避免无限循环。
  • 刷新顺序的操作如下:scanf("%*[^\n]")消耗与换行符不同的任何字符并丢弃它们。 scanf("%*c")读取下一个字符(如果有)并将其丢弃。如果我们尚未到达结束文件,则此字符将为'\n'scanf("%*c")相当于getchar()