如果在 C 中使用 scanf 输入字符,如何获取打印错误

Posted

技术标签:

【中文标题】如果在 C 中使用 scanf 输入字符,如何获取打印错误【英文标题】:How to get errors to print if chars are entered using scanf in C 【发布时间】:2013-09-17 02:34:38 【问题描述】:

我现在正在试验 c,这个程序假设让用户输入一个介于 10-100 之间的数字,如果他输入的任何内容不符合这些条件,程序将退出并显示错误代码1.任何符合条件的,程序都会以0退出。下面是目前的代码,但拒绝打印char检测正确的错误。

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


int intGet(int ,int);
int error();
int userIn;
char x;

int main(void) 
    printf("Enter a number in between [10 -­100]: \n");
    x = scanf("%d", &userIn);
    intGet(x, userIn);

    return EXIT_SUCCESS;


int intGet(int min,int max ) 
    min = 10;
    max = 100;

    x = userIn;
    if ((x < min) || (x > max)) 
        printf("Input out of Range\n");
        exit(EXIT_FAILURE);
     else if (x == 0) 
        printf("Incorrect input format\n");
        exit(EXIT_FAILURE);
     else 
        printf("Read %d\n", userIn);
        exit(EXIT_SUCCESS);
    


int error() 


【问题讨论】:

【参考方案1】:

不清楚您的问题是什么。您预计会出现什么错误?

您需要整理代码。有几件事。 scanf 返回 int 值 - 分配的输入项数。您将返回值分配给char x。然后将输入值分配给x。背后的逻辑是什么?你能指望什么?我想你的问题是合乎逻辑的。我建议你:

    分别处理返回值和输入值 删除exit() 语句,改用返回值。 exit() 终止程序。 删除全局变量 如果上述方法没有帮助,请使用 printf 查看正在处理的内容

例子:

int main(void) 
    printf("Enter a number in between [10 -­100]:\n");
    int userIn;
    int x = scanf("%d", &userIn);

    // for debug
    printf("Scanned: %d, returned: %d", x, userIn);

    int result = intGet(x, userIn);
    // analyse the result here
    switch (result) 
        case RES_SUCCESS:
           return SUCCESS;
        case ...
    



int intGet(int x, int value) 
    int const min = 10;
    int const max = 100;

    if (x != 1) 
        return RES_ERROR_NO_INPUT;
    

    if (value < min || value > max) 
        return RES_ERROR_OUT_OF_RANGE;
    

    return RES_SUCCESS;

【讨论】:

当我运行我的代码时,它完全忽略了 else if 语句。假设终止程序,这样我就可以知道它是退出 1 还是 0 退出 echo $? 用户输入了什么值?尝试为您的代码输入值 0。 输入值a123。它说输入超出范围,但是如果我将 if else 语句放在 if 之前。如果其他变成如果。它将检测字符而不是范围 您是否尝试按照我的示例在代码中添加 printf()?如果您输入 a123,则 scanf("%d",&UserIn) 返回 0 并且 UserIn 未分配任何值,即 UserIn 保存一个随机值。很可能在 [10, 100] 之外。 a123 不是数字,%d 表示整数值。 我很欣赏这些答案,尽管它们对我帮助不大。我发现了我必须做的事情并以另一种方式修复了我的代码。【参考方案2】:

问题的根本原因是大多数字符的 ASCII 码在 10 到 100 之间。

为了解决您的问题,我有一个复杂的解决方案,但它会有所帮助:

步骤:

1.将变量“UserIn”声明为 char * OR 字符数组

2.在scanf函数中使用%s而不是%d

3.使用strlen(UserIn)计算输入字符串的长度

4.如果长度不等于 2 OR 3 错误

5.现在检查UserIn[0] &gt; 9是否通过错误

6.现在检查UserIn[1] &gt; 9是否通过错误

7.现在检查长度是否为 3 和 UserIn[2] &gt; 9 否则通过错误

8.现在您必须使用以下方法将此字符串转换为十进制值:

decimal_UserIn = ((10^2)*UserIn[2])+((10^1)*UserIn[1])+((10^0)*UserIn[0])

9.现在您可以检查它是否适合您的范围(10-100)。

这里我假设您需要十进制格式的输入数据进行进一步处理,否则您可以在步骤 5,6 和 7 直接检查 0-9 内的字符串。

附:我可以帮你提供完整的代码,但是我的时间不多了。

【讨论】:

以上是关于如果在 C 中使用 scanf 输入字符,如何获取打印错误的主要内容,如果未能解决你的问题,请参考以下文章

C语言用如何用scanf输入带有空格的字符串

如何使用scanf获取提示输入?

C语言用如何用scanf输入带有空格的字符串

c语言中的变量的作用,如何从键盘中输入多个变量的值?

C语言如何在键盘中输入一个数字字符串并进行排序

第7课 - 程序中的数据输入