C:使用scanf时的无限循环

时间:2018-03-28 17:39:19

标签: c loops scanf

我使用以下结构:

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没有在每个循环中运行?

1 个答案:

答案 0 :(得分:1)

这一行的主要问题是:

scanf ("%[^\n]", &input);

是它从stdin缓冲区到'\n' 读取所有内容,并在缓冲区中留下'\n' 。因此,当您下次返回该行以从缓冲区读取时,缓冲区中的第一个字符仍为'\n',导致无法读取任何内容且缓冲区未被更改。

(该行的另一个问题是,如果读取的行长于input数组,则存在缓冲区溢出的风险。

有多种方法可以解决这个问题,但最简单的方法(也应该保护您免受缓冲区溢出)将是评论中提到的那个,方法是使用fgets(input, sizeof input, stdin);