1

我正在尝试阅读以下类型的输入:

[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

4 回答 4

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

这告诉scanf()

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

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

  3. 然后读一个逗号,

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

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

缺少的是,在阅读了开头的文字之后,您实际上并没有阅读开头的括号。因此,要么更改格式字符串以包含以下内容:

%[^(](%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);

看在上帝的份上,一些演示......

于 2013-06-14T19:26:46.973 回答
2

你忘了一个括号(

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

阅读完 not (-s 后,您想在阅读ints 之前消耗一个。

编辑为 H2CO3 好心提到:使用fgetsand strchror sscanf,它们更安全

于 2013-06-14T19:19:37.257 回答
1

因为(问题正在发生。您需要跳过该字符。

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

于 2013-06-14T19:16:45.477 回答
1

"%[^(]%d,%d)"--->"%[^(](%d,%d)"

于 2013-06-14T19:18:00.497 回答