如何阅读特定的输入格式

时间:2014-11-23 14:05:39

标签: c input scanf

我应该以“%c%d:%d:%d%d”的格式读取stdin的输入,并且开头的允许字符为+ - #

我试过的是

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;
        }
}

此代码失败,因为当我输入input + 15:00:00 1enterbutton #enterbutton时,它将\ n字符放入变量c中,该变量c在下面不匹配并返回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

我想用它做什么是当第一个char是+我在树A中存储数据时,如果它 - 我将它存储在树B中,当它#i创建新树

2 个答案:

答案 0 :(得分: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;
    }
}

请确保c的类型不应该是整数,因为它的地址作为scanf的参数传递。

答案 1 :(得分: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();
}