scanf读取格式化输入

时间:2013-06-14 19:14:06

标签: c++ c debugging

我正在尝试阅读那种输入:

[Some text] (x,y)

我需要以整数存储x,y。

我尝试了以下代码:

#include<iostream>
#include <cstdio>
using namespace std;

int main(){
    char temp[20];
    int x1, x2;
    scanf("%[^(]%d,%d)", temp, &x1, &x2);
    printf("%s %d %d", temp,x1,x2);
    return 0;
}

但是存储在x1和x2中的整数总是0.这是我得到的输出:

this is a trial (8,6)
this is a trial  0 0

错误是什么?

4 个答案:

答案 0 :(得分:5)

%[^(]%d,%d)

告诉scanf()

  1. 读取所有不是左(开头)括号的字符;

  2. 然后读取十进制整数,

  3. 然后读一个逗号,

  4. 然后读取另一个十进制整数,

  5. 然后使用尾随的右括号。

  6. 缺少的是,在阅读了主要文本后,您实际上并没有阅读开头词。因此,要么更改格式字符串以包含:

    %[^(](%d,%d)
    

    或者,更好的是,考虑手动解析字符串。 scanf()格式字符串模糊,很容易犯一个小错误,然后整个事情就会兴旺(就像发生在你身上一样)。怎么样呢?

    char buf[LINE_MAX];
    fgets(buf, sizeof(buf), stdin);
    const char *lparen = strchr(buf, '(');
    const char *comma = strchr(lparen + 1, ',');
    // const char *rparen = strchr(comma + 1, ')'); // is this even needed?
    
    char str[lparen - buf + 1];
    memcpy(str, buf, lparen - buf);
    str[lparen - buf] = 0;
    int n1 = strtol(lparen + 1, NULL, 10);
    int n2 = strtol(comma + 1, NULL, 10);
    

    Some demo for goodness sake...

答案 1 :(得分:2)

你忘了paren (

scanf("%[^(](%d,%d)", ...);
//          ^

在阅读(之后阅读非 - int之后,你想要消费一个。{/ p>

编辑正如提到的H2CO3:使用fgetsstrchrsscanf,它们非常safer

答案 2 :(得分:1)

由于(问题正在发生。你需要跳过那个角色。

使用:scanf("%[^(](%d,%d)", temp, &x1, &x2);

答案 3 :(得分:1)

"%[^(]%d,%d)" ---&gt; "%[^(](%d,%d)"