2016-01-28 80 views
0

我試圖從標準輸入中讀取字符和行,並且遇到了問題。scanf第二次未讀取輸入

這是我想讀入變量輸入:

6 4 
engine 
brakes 
tires 
ashtray 
vinyl roof 
trip computer 
Chevrolet 
20000.00 3 
engine 
tires 
brakes 
Cadillac 
70000.00 4 
ashtray 
vinyl roof 
trip computer 
engine 
Hyundai 
10000.00 3 
engine 
tires 
ashtray 
Lada 
6000.00 1 
tires 
0 0 

第一行是兩個數字代表有多少零件將被列出,然後又有多少企業會盡量滿足這些零件。

六條線是試圖匹配部件要求的公司的名稱,其後的下一行是兩個數字:該車將花費多少,以及製造商可以滿足多少部件要求。

然後,列出製造商可以放入汽車的零件。

然後,來自其他製造商,他們的汽車的成本,他們能夠滿足零件,零件清單等

最後,我打印出來誰中標。

這是我使用這樣做代碼:

#define MAX_LEN 80 

int main(){ 
    int rfpNum = 0; 
    int n, p, reqMet, numMet, nCopy, numActualMet; 
    float maxCompliance=-1, lowestBid=-1, tmpCompliance; 
    float bid; 
    char req[MAX_LEN], bidder[MAX_LEN]; 
    char winner[MAX_LEN]; 
    char **reqs; 
    char *pos; 

    while (scanf("%d %d *[^\n]", &n, &p), (n && p)){ 
     reqs = new char*[n]; 
     nCopy = n; 

    maxCompliance = -1; 

     while (nCopy--){ 
      fgets(req, MAX_LEN, stdin); 
      if ((pos=strchr(req, '\n')) != NULL) 
       *pos = '\0'; 
      reqs[nCopy] = new char[MAX_LEN]; 
      sprintf(reqs[nCopy], "%s", req); 
     } 

     while (p--){ 
      fgets(bidder, MAX_LEN, stdin); 
      if ((pos=strchr(bidder, '\n')) != NULL) 
       *pos = '\0'; 

      numActualMet = 0; 
      scanf("%f %d *[^\n]", &bid, &numMet); 

      while (numMet--){ 
       fgets(req, MAX_LEN, stdin); 
       if ((pos=strchr(req, '\n')) != NULL) 
        *pos = '\0'; 
       for (int i=0; i<n; i++){ 
        if (strcmp(req, reqs[i]) == 0) numActualMet++; 
       } 
      } 
      tmpCompliance = (float) numActualMet/n; 

      if (tmpCompliance > maxCompliance){ 
       maxCompliance = tmpCompliance; 
       strncpy(winner, bidder, MAX_LEN); 
     lowestBid = bid; 
      } 
      else if ((maxCompliance == tmpCompliance) && (lowestBid == -1 || bid < lowestBid)) { 
       lowestBid = bid; 
       strncpy(winner, bidder, MAX_LEN); 
      } 
     } 

     rfpNum++; 
     if (rfpNum != 1) 
      printf("\n"); 

     printf("RFP #%d\n", rfpNum); 
     printf("%s\n", winner); 

    } 
    return 0; 
} 

問題是,我必須輸入0 0兩次它退出之前。任何想法爲什麼?

回答

2

問題是,我必須在退出前兩次輸入0 0。任何想法爲什麼?

while (scanf("%d %d *[^\n]", &n, &p), (n && p)){ 

預計不僅兩個整數讀入np,也等待非空白字符與格式*[^\n]部分匹配。如果你輸入任何字符,不只是0 0,程序將停止。我可以通過輸入abc來終止它。

更好的方法是使用fgets()後跟sscanf

char buffer[100]; // Make it large enough 
while (fgets(buffer, 100, stdin) != NULL) 
{ 
    int n = sscanf(buffer, "%d %d", &n, &p); 
    if (n != 2) 
    { 
     // Deal with error. 
    } 

    if (n == 0 && p == 0) 
    { 
     break; 
    } 

    // Rest of the loop 

} 

作爲一項政策,儘量避免混fgetsfscanf。當一起使用時,它們充滿了問題。