scanf读取格式化输入

Niv*_*tha 1 c c++ debugging

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

[Some text] (x,y)
Run Code Online (Sandbox Code Playgroud)

我需要在整数中存储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;
}
Run Code Online (Sandbox Code Playgroud)

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

this is a trial (8,6)
this is a trial  0 0
Run Code Online (Sandbox Code Playgroud)

错误是什么?

小智 5

%[^(]%d,%d)
Run Code Online (Sandbox Code Playgroud)

这说明scanf():

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

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

  3. 然后读一个逗号,

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

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

缺少的是,在阅读了主要文本之后,您实际上并未阅读开头词.因此,要么更改您的格式字符串,要包括:

%[^(](%d,%d)
Run Code Online (Sandbox Code Playgroud)

或者,更好的是,考虑手动解析字符串.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);
Run Code Online (Sandbox Code Playgroud)

一些为了善良而进行的演示......