当前位置: 首页 > 知识库问答 >
问题:

使用C中的函数进行输入验证

景承教
2023-03-14

我正在通过函数验证用户输入。

这是我的代码:

#include <stdio.h>

void get_income(double *pschool, double *pincome);
double get_double(void);

main()
{
    get_income(&pschool, pincome);
}

void get_income(double *pschool, double *pincome) {
    int tuition, supplies;

    printf("Enter tuition:");
    scanf("%d", &tuition);
    printf("Enter supplies:")
    scanf("%d", &supplies);

    *pSchool = tuition + supplies;
    return;
}

double get_double(void) {
    // validation code should go in here 
}

我需要验证用户提供的学费用品的值,以确保它们都是0或更大且不为空。不应接受负值或除数字以外的任何内容。

验证代码应该在get\u double函数中,我似乎不知道如何验证驻留在单独函数中的内容。请寻求指导。

共有3个答案

訾俊名
2023-03-14

该代码存在许多问题,包括:

  • 不检查scanf()函数查找数据
  • main()的声明不正确
  • 将未使用的指针传递到get\u income()
  • 不从检查功能返回状态
  • 未报告输入的数据
  • 未在main()中声明变量
  • 函数名称与目的不匹配
  • 读取浮点数存储的整数
  • 等等

“读取一行并用sscanf()解析它”可能比“让scanf()读取数据”做得更好;更容易处理错误报告。

这些观察结果导致:

#include <stdio.h>

int get_tuition_and_supplies(double *ptuition, double *psupplies);
int get_double(double *pvalue);

int main(void)
{
    double tuition, supplies;
    if (get_tuition_and_supplies(&tuition, &supplies) == 0)
        printf("Tuition: %.2f; supplies %.2f\n", tuition, supplies);
    return(0);
}

int get_tuition_and_supplies(double *ptuition, double *psupplies)
{
    int rc = -1;    // Failure
    printf("Enter tuition: ");
    if (get_double(ptuition) == 0)
    {
        printf("Enter supplies: ");
        if (get_double(psupplies) == 0)
            rc = 0;
    }
    return rc;
}

int get_double(double *pvalue)
{
    char buffer[4096];
    int rc = -1;
    if (fgets(buffer, sizeof(buffer), stdin) == 0)
        fprintf(stderr, "EOF (or error) reading data\n");
    else if (sscanf(buffer, "%lf", pvalue) != 1)
        fprintf(stderr, "Did not find a number in input (%.32s)\n", buffer);
    /* Could check for no extracharacters (blanks allowed) up to newline */
    else if (*pvalue < 0.0)
        fprintf(stderr, "Value (%g) may not be negative\n", *pvalue);
    else
        rc = 0;
    return rc;
}

“将返回代码(rc)设置为失败,直到证明成功”的习惯用法是处理验证的一种有效技术。最好在get_double()函数中包含提示,这样它的签名就变成了:

int get_double(const char *prompt, double *pvalue);

这允许您将get_tuition_and_supplies()中的代码简化为:

int rc = -1;    // Failure
if (get_double("Enter tuition: ", ptuition) == 0 &&
    get_double("Enter supplies: ", psupplies) == 0)
    rc = 0;
return rc;

这可以灵活地扩展到处理多个值,而不仅仅是两个值。

庞意智
2023-03-14

对我来说,我真的不喜欢使用scanf,因为这样。以下是我将如何解决您的问题:

  1. 分配字符数组。充当将写入输入的缓冲区。大小一般需要反映用途。也就是说,如果我只接收一个不大于1000(整数类型)的数字,那么我只会分配6个字符。最后两个是'\n''\0'
  2. 数组中最后一个元素之前的一个初始化为'\n'以检测溢出。
  3. 使用fegts()函数接收输入。
  4. 通过检查我初始化为'\n'的最后一个元素之前的一个是否已更改来检查溢出。如果是这样,我报告溢出错误,否则继续执行。
  5. 使用atof()atoi()函数分别转换为双精度或整数值。

我想知道我的方法是否包含任何类型的bug,但据我所知,它工作得很好。

水浩歌
2023-03-14

在我看来,get\u double()的目的似乎是处理用户输入。这就是我要做的:

#include <stdio.h>

int get_double(double *in)
{
    scanf("%d", in);
    if (*in < 0) {
        printf("error message");
        return 1;
    }
    return 0;
}

void get_income(double ptuition, double psupplies, double *pschool)
{
    *pschool = ptuition + psupplies;
}

int main(void)
{
    double ptuition, psupplies, pschool;

    printf("Enter tuition: ");
    if (get_double(&ptuition)) {
        return 1;
    }

    printf("\nEnter supplies: ");
    if (get_double(&psupplies)) {
        return 1;
    }

    get_income(ptuition, psupplies, &pschool);
    printf("Total school cost: %f", pschool);
    return 0;
}
 类似资料:
  • 问题内容: 哦,我的话我是个傻瓜。 调用函数时,我只是省略了第二个和第三个参数。像个傻瓜。因为那就是我。原来愚蠢的问题如下: 这似乎是它必须做一个很平常的事,但是我无法找到相关的教程,我太无知了约,并弄明白自己。 我的文件中有一个C函数。 (您可能会猜到,我最初的参数为double 而不是void ,但无法弄清楚在Python方面该怎么做。我当然很想将其改回来,但我并不挑剔只要有效。) 我用它制作

  • 有人能帮我完成输入验证功能吗。我正在验证整数输入。问题是当用户输入多个整数my cin时。fail()对每个整数运行,导致我的错误显示多次。让我告诉你我的意思 这是我的代码: 因此,如果用户要输入“jjj”;我的“请只输入整数”显示三次。我只想让它显示一次。我不知道怎么做。有什么想法吗?

  • 问题内容: 在Python中,该模块可用于在一系列值上并行运行函数。例如,这将生成f的前100000个评估的列表。 当f接受多个输入而只有一个变量变化时,是否可以做类似的事情?例如,如何并行处理此: 问题答案: 有几种方法可以做到这一点。在问题给出的示例中,您可以定义一个包装函数 然后将此包装传递给。一种更通用的方法是使用一个包装器,该包装器使用一个元组参数并将该元组解包为多个参数 或使用等效的l

  • 问题内容: 我是这个C ++世界的新手,正在尝试为数字密码编写输入验证功能。这是我到目前为止所得到的: 对于不正确的值,它工作得很好,但在有效输入时不会中断循环。知道我在这里缺少什么吗?干杯!! James Kanze脚本的ErroR: 新代码: 使用 和 验证作为字符串 感谢所有人(尤其是James Kanze)的帮助。这件事在这里很有效。 那里还有进一步改进的空间吗?干杯!! 问题答案: 这看

  • 问题内容: 我正在使用ASP.net C#创建一个Web应用程序。我有一个预订表格,我需要使用存储过程将数据插入表中。该表有几列,其中第二列是计算列。设置存储过程以插入数据并在插入后从第二列中获取值。以下是存储过程的代码: 我想单击一下按钮即可插入数据:我能够找出以下代码…。 请帮助…。我想捕获返回的RcptNo,以后打算调用另一个ASPX页并使用查询字符串传递值。 谢谢 问题答案: 使用简单的S

  • 出于我无法控制的原因,我必须在我的C代码中实现这个函数: 调用此函数时,编译器是否忽略它,或者是否仍然进行调用?例如: 两行代码的执行时间是相同的,还是第一行需要更长的时间?