请帮助我理解下面的代码。
函数get_digit
按地址采用字符参数。我无法得到什么
scanf("%1[0123456789]", ch)
在这里做。
如果我在终端上给出1234,那么它只需要第一个数字。同样如果我给2345它需要2.我从来没有遇到scanf
的这种用法。请帮助我理解这个功能。
int get_digit ( char *ch )
{
int rc;
printf ( "Enter a single digit: " );
fflush ( stdout );
if ( rc = scanf ( "%1[0123456789]", ch ) == 1 ) {
jsw_flush();
}
return rc;
}
void jsw_flush ( void )
{
int ch;
do
ch = getchar();
while ( ch != '\n' && ch != EOF );
clearerr ( stdin );
}
void fill_table ( char table[] )
{
char ch;
while ( get_digit ( &ch ) ) {
unsigned i = ch - '0';
if ( table[i] != 0 ) {
printf ( "That index has been filled\n" );
}
else {
table[i] = ch;
}
}
}
void show_table ( const char table[], size_t size )
{
size_t i;
for ( i = 0; i < size; i++ ) {
printf ( "%c\n", table[i] != 0 ? table[i] : '~' );
}
}
答案 0 :(得分:5)
scanf ( "%1[0123456789]", ch )
扫描1个字符(%1
),它是[0123456789]
指向的字符的十进制数字(ch
)。
紧跟%
之后的数字是字段宽度,要扫描的字符数(最大)。方括号内的字符是scanf
将接受的字符。当遇到未列出的字符时,扫描结束。
扫描两位数字的一个非常简单的例子:
#include <stdlib.h>
#include <stdio.h>
int main(void) {
char chs[2] = {0}; // space for two digits, zero-initialized
unsigned u = 0, i;
if (scanf("%2[0123456789]",&chs[0]) == 1) {
// parse the number
for(i = 0; i < 2 && chs[i]; ++i) {
u = 10*u + chs[i] - '0';
}
printf("Got %u\n",u);
} else {
puts("Scan failed.");
}
return EXIT_SUCCESS;
}
当然,我们可以使字符数组比我们期望的数字长一些(零初始化!,scanf
不添加0终结符,而不是解析自己。格式化)并将解析保留为strtoul(chs,NULL,10)
。