【问题标题】:In C how do I detect whether an input is a character or integer at the same time?在 C 中,如何同时检测输入是字符还是整数?
【发布时间】:2017-08-24 16:10:19
【问题描述】:

对 C 语言非常陌生,因此对阅读时间长而且毫无疑问是垃圾编程表示歉意。

所以我的程序正在读取一个 CSV 文件,其中包含 15 种不同晶体管的规格。然后,它将输入与 CSV 文件中的数据进行比较。输入数据后,程序确定最合适的晶体管。这意味着循环直到输入字母 q,也就是程序停止的时间。

输入输入为例如。

10 0.05 120 5000 20

分别代表伏特、安培、功率、频率和增益。该计划不关心类型、公司或价格。

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#define MAX 15
#define MAX_IN 10000

struct data{
char type[10], company[10];
int volt, power, freq, gain;
float amp, price;
};

struct input{
int volt, power, freq, gain;
float amp;
};
struct input inputs[MAX_IN];
struct data datas[MAX];


main()
{
    int chk = 1, num=0;
    while(chk == 1)
    {
        chk = input_function(&num);
    }
}

int input_function(int *number)
{
    int j=0;
    char check=0;

    scanf("%c%d %f %d %d %d", &check, &inputs[j].volt, &inputs[j].amp, inputs[j].power, &inputs[j].freq, &inputs[j].gain);

    if(check!='q')
    {
        check_function(j);
        ++*number;
        ++j;
        return 1;
     }
     else
     {
        return 0;
     }
}

num 是一个整数,用于确定我输入了多少输入,以便检查函数比较输入结构的正确输入。

在以前的类似问题中,使用 %c%d 让它同时检查字符和整数,但这不起作用。

以前我几乎可以使用它,但是它以 q 作为电压的第一个输入 - 所以之后的每个输入都关闭了一个。有人有什么想法吗?

【问题讨论】:

  • 如果您通过fgets 获得输入,您可以在闲暇时检查该字符串。不要忘记它保留的尾随newline。一旦确定不是退出,请申请sscanf
  • 另外,您应该检查来自scanf 的返回值(如果删除%c,则为5)。如果第一个字符是'q',那么整数转换将被拒绝,'q' 保留在输入缓冲区中。但是您还需要考虑逗号:您说它们是 CSV 文件。在这种情况下,我会使用 fgetsstrtok 或其可重入版本。
  • 当我使用 fgets 时它不会提示输入任何内容?我该怎么做?
  • 我不懂你。程序无论如何都没有输入提示。
  • scanf(" %c", &amp;check); if(check!='q'){ ungetc(check, stdin); scanf("%d %f %d %d %d", &amp;inputs[j].volt, ...。还有int j=0; --> int j = *number;

标签: c csv input integer character


【解决方案1】:

scanffscanfsscanfbroken-as-specified,不应该永远用于任何东西。忘记你听说过它们。

使用fgets(或getline,如果可用)读取整行。手动检查它的第一个字符。如果是q,则退出。否则,使用对strtolstrtod 的调用链来解析行并将文本转换为机器编号。 (密切注意 strtol/strtod 联机帮助页中解释如何检查错误的部分;这有点棘手。)

【讨论】:

    猜你喜欢
    • 2021-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-29
    • 1970-01-01
    • 2013-11-06
    • 1970-01-01
    相关资源
    最近更新 更多