C语言 如果我在input中输入一个非整数值,代码会突然出现故障

lg40wkob  于 2023-08-03  发布在  其他
关注(0)|答案(3)|浏览(133)
#include <stdio.h>

void number_checker(int n);

int main(void) {

    int a, b; 

    while (1) {

        printf("Digit checker\n");

        printf("\nEnter the character: ");

        scanf("%d", &a); 

        number_checker(a);

        printf("\nIf you want to continue press 1\n");

        scanf("%d", &b);

        if (b == 1) {

            continue;

        } else {

            printf("Thanks for using");

            break; 
        }

        return 0;
    }
}

void number_checker(int n) {

    if (n >= 0 && n <= 9) {

        printf("\nEntered character is a digit\n");

    } else {

        printf("\nEntered character is not a digit\n");

    }
}

字符串


的数据
它对整数很好,但对其他字符却陷入了循环,我想知道为什么它会永远运行下去

v7pvogib

v7pvogib1#

scanf("%d", &a)跳过标准输入中的任何白色字符,然后尝试读取数字并将其转换为int值,并将其存储到a中。
如果您键入一个带有小数点的数字,scanf()将在小数点处停止,这不是一个数字,如果.之前至少有一个数字,则返回1,并将int值存储到a中。
随后的调用scanf("%d", &b)找到了挂起的.,并且未能转换int,使b保持不变,即:未初始化,并返回0以指示它无法执行单个转换。
循环继续进行,每次调用scanf()都以相同的方式失败,没有从标准输入中消耗任何字符。这解释了你的观察。
不应直接使用scanf(),而应一次读取一行输入,并使用sscanf()尝试转换,检查返回值并报告任何无效或丢失的输入。
您应该检查scanf()的返回值以检测无效或丢失的输入。
还要注意的是,%d读取和转换的是一个整数(双关语),而不仅仅是一个数字,所以在函数number_checker()中的测试有点不合适。
以下是修改后的版本:

#include <stdio.h>

void number_checker(int n);

int main(void) {
    char buf[80];
    int a, b, len; 

    printf("Digit checker\n\n");

    for (;;) {
        printf("Enter the character: ");
        if (!fgets(buf, sizeof buf, stdin))
            break;

        if (sscanf(buf, "%d%n", &a, &len) == 0) {
            printf("not a number: %s\n", buf);
            continue;
        }
        if (buf[len] != '\n') {
            printf("extra characters: %s\n", buf + len);
            continue;
        }

        number_checker(a);

        printf("If you want to continue press 1\n");
        if (!fgets(buf, sizeof buf, stdin))
            break;

        if (sscanf(buf, "%d", &b) == 1 && b == 1) {
            continue;
        } else {
            break;
        }
    }
    printf("Thanks for using");
    return 0;
}

void number_checker(int n) {
    if (n >= 0 && n <= 9) {
        printf("Number entered is a single digit\n");
    } else {
        printf("Number entered has multiple digits or is negative\n");
    }
}

字符串

qnzebej0

qnzebej02#

输入的意思是scanf("%d", &a)scanf("%d", &b),非整数结果为error的原因是scanf函数中的%d说明符专门读取舍入数。它甚至不会读取float数字。

vuktfyat

vuktfyat3#

它会发生故障,因为您不能在int变量中存储非int值。C编译器总是检查类型。为了克服这个问题,首先需要将其放入char array中,然后检测它是否是一个数字,然后将其存储在int变量中。
快捷方式:scanf函数如果接收到数字,则返回1
示例如下:

#include <stdio.h>

int main() {
    int number;

    printf("Enter an integer: ");
    scanf("%d", &number);

    if (scanf("%d", &number) == 1) {
        printf("Input is a valid integer. Stored value: %d\n", number);
    } else {
        printf("Invalid input. Please enter an integer.\n");
    }

    return 0;
}

字符串

相关问题