我正在尝试以(int,int)格式读取输入,在该输入中,开始和第一个(,(和第一个int之间,在第一个int和逗号之间,可能有N个空格,以此类推,直到end,在)和输入的结尾之间也可以是N个空格。
例如:$ _( int, int )___ .
读取_
为空格。
到目前为止,我有这个但它不起作用:
scanf("%*[](%*[]%d%*[],%*[]%d%*[])%*[])")
我的%*[]
用于忽略空格的地方。
有人可以帮我吗?
尝试一下:scanf("%*[ ](%*[ ]%d%*[ ],%*[ ]%d%*[ ])%*[ ]",&a,&b);
其中a
和b
是两个整数。在您的问题中,缺少整数变量的部分。
scanf()和sscanf()通常希望跳过空白。格式中的一个空格足以指定它。因为您只关心这两个int,所以不需要为scanf()提供有关第二个int之后的内容的任何信息。如果可以接受,只需从空白处开始查看line
,就在第一个(
之后,直到最后一个int。这是一个使用“指针魔术”的示例,其中line
是一个char缓冲区,并且没有测试是否在ptr + 1处有任何内容:
char *ptr = 0;
int x = 0, y = 0, n = 0;
for( ptr = line; *ptr; p++ )
if( *ptr == '(' ) break;
n = sscanf( ptr+1, " %d, %d", &x, &y );
n将包含分配的字段数(在这种情况下应为两个),x和y是您感兴趣的两个整数。
Similary,要使用scanf(),您可以抓住并扔掉第一部分:
n = scanf( "%s ( %d, %d", garbage, &x, &y );
其中,垃圾是一个足够大的char缓冲区,您无需查看。在这种情况下,n为3。
"%*[]"
不会not忽略空格。 "%*[](%*[]"
表示要使用']'
,'('
,'%'
,'*'
,'['
字符。
// v---v scanset
"%*[](%*[]"
["%*[ ]"
确实消耗空间,但仅消耗空间,而不是所有空白。
使用" "
忽略所有空格(包括'\n'
)。
给出格式$ _( int, int )___ .
,其中_
是任意数量的空白使用
int n = 0;
int result = scanf(" $ (%d ,%d ) .%n", &int1, &int2, &n);
if ((result != 2) || (n == 0)) {
; // failed, handle error.
}
让我们分解scanf()格式
" "
匹配0到无限数量的空格。"$"
匹配一个'$'
"("
匹配'('
"%d"
匹配任意数量的前导空白,然后查找int
,并存储在相应的int *
中。","
匹配','
")"
匹配')'
"."
匹配'.'
"%n"
将到目前为止已解析的char
的数量保存到相应的int *
中。对此指令采取行动不会影响scanf()
结果。
如果需要比此解决方案中所建议的更具体的扫描,可以随意使用%n
。
我知道这是一个古老的问题,但仍然可以在搜索中找到。我偶然发现它在寻找其他东西,但惊讶的是还没有一个简单正确的答案。
假设N不是特定的空格数,则要使用的格式字符串为“(%d%1s%d)”分解,
下面是使用sscanf()的示例程序,该程序使用与fprintf()相同的格式字符串。
#include <stdio.h>
int main(void) {
const char tests[] =
"(1,2)"
"(3, 4 )"
" ( 5 , 6 )"
" (7 ,8)"
;
const char *string_to_scan = tests;
for ( ; ; ) {
int n1, n2;
int n_char_read;
char s[2];
const int rc_scan = sscanf(string_to_scan, " (%d%1s%d )%n",
&n1, s, &n2, &n_char_read);
if (rc_scan == EOF) { /* End of string reached */
break;
}
if (rc_scan != 3 || *s != ',') {
(void) fprintf(stderr, "Scan error!\n");
break;
}
(void) fprintf(stdout, "Read %d characters. n1=%d and n2=%d\n",
n_char_read, n1, n2);
string_to_scan += n_char_read;
}
return 0;
}
输出:
Read 5 characters. n1=1 and n2=2
Read 9 characters. n1=3 and n2=4
Read 15 characters. n1=5 and n2=6
Read 8 characters. n1=7 and n2=8
请注意,%n用于逐步测试字符串。重要的是,在格式字符串中使用%1s而不是%s可以防止在读取格式错误的字符串(如(1,,2))时导致缓冲区溢出。