⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 _scanf.c

📁 AVR-GCC 自带库的原码
💻 C
字号:
#include <ctype.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>
#include <_const.h>
#include "_stdio.h"

#define MAX	10

static void ReadString(char *s, char (*get)(void), void (*unget)(char))
	{
	int c;

	while (c = get())
		{
		if (isspace(c))
			{
			unget(c);
			break;
			}
		*s++ = c;
		}
	*s = 0;
	}

static void ReadInteger(char *s, char (*get)(void), void (*unget)(char), 
		int base)
	{
	int c;

	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;
		}
	*s = 0;
	}

int _scanf(char (*get)(void), void (*unget)(char), CONST char *fmt, va_list va)
	{
	int is_long, c, base;
	char *vp;
	char s[MAX+1];
	int 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 'X':
			case 'x': base = 16;
				read_strtoul:

				converted++;
				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':
				converted++;
				ReadInteger(s, get, unget, 10);
				if (is_long)
					*(long *)vp = strtol(s, 0, 10);
				else
					*(int *)vp = strtol(s, 0, 10);
				break;
			case 's':
				converted++;
				ReadString(vp, get, unget);
				break;
			default:
				puts("unsupported format");
				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 + -