📄 _scanf.c
字号:
/* For AVR, do not compile this file standalone in libsrc.common\stdio
*/
#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>
#include <ctype.h>
#include "_stdio.h"
#ifndef _SCANF
#define _SCANF _scanf
#define XCONST const
#endif
#define MAX 10
static int converted;
static void ReadString(char *s, char (*get)(void), void (*unget)(char))
{
int c;
int seen = 0;
while (c = get())
{
if (isspace(c))
{
unget(c);
break;
}
*s++ = c;
seen = 1;
}
*s = 0;
converted += seen;
}
static void ReadInteger(char *s, char (*get)(void), void (*unget)(char),
int base)
{
int c;
int seen = 0;
while (c = get())
{
if (base == 16)
{
if (!isxdigit(c))
{
unget(c);
break;
}
}
else if (base == 8)
{
if (!isdigit(c) || c >= '8')
{
unget(c);
break;
}
}
else
{
if (!isdigit(c) && c != '-')
{
unget(c);
break;
}
}
*s++ = c;
seen = 1;
}
*s = 0;
converted += seen;
}
int
_SCANF(char (*get)(void), void (*unget)(char), XCONST char *fmt, va_list va)
{
int is_long, c, base;
char *vp;
char s[MAX+1];
converted = 0;
while (c = *fmt++)
{
if (c == '%')
{
if (*fmt == 'l')
{
is_long = 1;
fmt++;
}
else
is_long = 0;
vp = va_arg(va, void *);
switch (*fmt)
{
case 'c':
*(char *)vp = get();
converted++;
break;
case 'o': base = 8; goto read_strtoul;
case 'u': base = 10; goto read_strtoul;
case 'p':
case 'X':
case 'x': base = 16;
read_strtoul:
ReadInteger(s, get, unget, base);
if (is_long)
*(unsigned long *)vp = strtoul(s, 0, base);
else
*(unsigned *)vp = strtoul(s, 0, base);
break;
case 'd':
ReadInteger(s, get, unget, 10);
if (is_long)
*(long *)vp = strtol(s, 0, 10);
else
*(int *)vp = strtol(s, 0, 10);
break;
case 's':
ReadString(vp, get, unget);
break;
default: {
static FLASH char err[] = { "unsupported format" };
#if defined(_AVR)
cputs(err);
#else
puts(err);
#endif
}
break;
}
fmt++;
}
else if (isspace(c))
{
while ((c = get()) && isspace(c))
;
unget(c);
}
else if (get() != c)
break;
}
return converted;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -