2014-11-23 24 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不是整数。