对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是一个整数,用于确定我输入了多少输入,以便check函数比较输入结构的正确输入。
在以前类似的问题中,使用%c%d让它同时检查字符和整数,但这不起作用。
以前我几乎让它工作了,但它把q作为电压的第一个输入 - 所以之后的每个输入都被一个输出。有人有什么想法吗?
答案 0 :(得分:3)
scanf
,fscanf
和sscanf
为broken-as-specified, EM>。忘记你曾经听过他们。
使用fgets
(或getline
(如果有))阅读整行。手动检查其第一个字符。如果是q
,请退出。否则,使用对strtol
和strtod
的一连串调用来解析该行并将文本转换为机器编号。 (密切关注strtol
/ strtod
联机帮助文档中解释如何检查错误的部分;这有点棘手。)