2014-11-23 59 views
2

我應該從stdin讀取輸入的格式,如「%C%d:%d:%d%d」開頭,並允許字符是+ - #如何讀取特定的輸入格式

我已經嘗試是因爲當我輸入輸入+ 15:00:00 1enterbutton#enterbutton它把\ n字符到未下面匹配變量c和返回0

這裏是

while(1){  
    ret = scanf(" %c %d:%d:%d %d",&c,&h,&m,&s,&id); 
    if (ret != 5) break; 

     if(c=='#') { 
      log++; 
      abs_prev=-1; 
      continue; 
     }else if(c=='+'){} 
     else if(c=='-'){} 
     else{ 
      printf("invalid input.\n"); 
      return 0; 
     } 
} 

此代碼失敗我的輸入可能看起來像什麼 + 8:00:00 100 + 8:50:00 105 - 9:30:00 100 - 18:20:00 105 - 19:00:00 100 # - 17:00:00 100 + 18:00:00 100 # # + 8:00:00 66 + 9:00:00 200 + 10:00:00 100 - 15:00:00 200 - 17:30:00 66

我想用它做的是,當第一個字符是+我存儲在樹中的數據,如果它 - 我將其存儲在B樹時,其#我創建新樹

+0

您可以變更scanf()的如'的scanf( 「%C%d:%d:%d%d%* C」,& C,&H,M,S,&id);' – Gopi 2014-11-23 17:05:10

+0

RET = scanf的( 「%c%d:%d:%d%d」,&c,&h,&m,&s,&id);?。什麼是ret的數據類型? – Shravan40 2014-11-26 07:31:47

回答

1

閱讀用戶輸入與fgets(),然後掃描它。

char buf[100]; 
if (fgets(buf, sizeof buf, stdin) == NULL) 
    Handle_EOF(); 

// Note spaces before %d are not needed 
int ret = scanf(" %c%d:%d:%d%d", &c, &h, &m, &s, &id); 
if (ret == 1) { 
    if (c != '#') 
    Handle_InvalidInput(); 
    log++; 
    abs_prev = -1; 
} else if (ret == 5) { 
    if (c != '+' && c != '-') { 
    printf("invalid input.\n"); 
    return 0; 
    } 
} else { 
    Handle_InvalidInput(); 
} 
1

你最好到因爲輸入行可以採用不同的格式,因此可以重構代碼。下面的代碼似乎是你的目的的工作:

while (1){ 
    if (scanf(" %c", &c) != 1) break; 

    if (c=='#') { 
     log++; 
     abs_prev=-1; 
     continue; 
    } 

    ret = scanf("%d:%d:%d %d",&h,&m,&s,&id); 
    if (ret != 4) break; 

    if (c == '+') {} 
    else if (c == '-') {} 
    else { 
     printf("invalid input.\n"); 
     return 0; 
    } 
} 

請確保自其地址爲scanf參數傳遞的c類型應該是char不是整數。