我使用以下结构:
struct Transistor {
char type_number[50];
char supplier[50];
int maxVce;
float maxIc;
int max_power;
int max_freq;
int max_gain;
float price;
};
运行代码:
while(1==1){
printf("Insert parameters: \n");
char input[100];
scanf ("%[^\n]", &input);
char *token = strtok(input, " ");
if(input[0]=='q'){
return 0;
}
parameters[0]=atoi(token);
token = strtok(NULL, " ");
ic=atof(token);
token = strtok(NULL, " ");
parameters[1]=atoi(token);
token = strtok(NULL, " ");
parameters[2]=atoi (token);
token = strtok(NULL, " ");
parameters[3]=atoi(token);
printf ("\n Parameters: \nVCe:%d,\nPow:%d,\nFreq:%d,\nGain:%d \nIce:%.3f\n",parameters[0],parameters[1],parameters[2],parameters[3],ic);
printf("Transistor that matches your requirements: \n");
for(a=0; a<15; a++){
i=0;
if(parameters[0]<=all_Transistors[a].maxVce){
i++;
}
if(parameters[1]<=all_Transistors[a].max_power){
i++;
}
if(parameters[2]<=all_Transistors[a].max_freq){
i++;
}
if(parameters[3]<=all_Transistors[a].max_gain){
i++;
}
if(ic<=all_Transistors[a].maxIc) {
i++;
}
if(i==5){
printf("\n\nTransistor name: %s\n",all_Transistors[a].type_number);
printf("Supplier: %s\n",all_Transistors[a].supplier);
printf("Maximum Vce: %d\n",all_Transistors[a].maxVce);
printf("Maximum Ic: %.3f\n",all_Transistors[a].maxIc);
printf("Maximum power: %d\n",all_Transistors[a].max_power);
printf("Maximum freq: %d\n",all_Transistors[a].max_freq);
printf("Maximum gain: %d\n",all_Transistors[a].max_gain);
printf("Price: %.3f\n",all_Transistors[a].price);
}
}
}
事情是: 我正在输入第一组参数,如:
1 1.1 2 3 4
它再次运行良好的循环运行,但scanf
不是,只要用户输入q
作为输入的第一个字符,它就应该有效。
为什么scanf
没有在每个循环中运行?
答案 0 :(得分:1)
这一行的主要问题是:
scanf ("%[^\n]", &input);
是它从stdin
缓冲区到'\n'
读取所有内容,并在缓冲区中留下'\n'
。因此,当您下次返回该行以从缓冲区读取时,缓冲区中的第一个字符仍为'\n'
,导致无法读取任何内容且缓冲区未被更改。
(该行的另一个问题是,如果读取的行长于input
数组,则存在缓冲区溢出的风险。
有多种方法可以解决这个问题,但最简单的方法(也应该保护您免受缓冲区溢出)将是评论中提到的那个,方法是使用fgets(input, sizeof input, stdin);
。