C语言之可变参实现scanf函数

既然有printf函数可变参实现,那就一定有scanf函数的可变参实现。废话不多说,源码奉上:

本源码不过多分析,如要明白原理,请翻本博客以往的文章看说明。

欢迎关注新浪微博:http://weibo.com/u/1896293701/home?topnav=1&wvr=6

#include <stdio.h>
#include <stdarg.h>

int myscanf(const char *fmt , ...) ;

int main(void)
{
	int num ;
	printf("pls input num:\n");
	myscanf("%d",&num);
	printf("num:%d\n",num);
	return 0 ;
}
//以下的实现方法我就不多做解释了,以往的博客写得很详细,翻翻就可以看懂,不难。
int myscanf(const char *fmt , ...)
{
	va_list ap ;
	int ret ;
	va_start(ap , fmt);
	ret = vscanf(fmt,ap); //这里调用了C库的vscanf函数,以后找到它再把它弄出来,分析方法和vprintf雷同。
	va_end(ap);
	return ret ;
}

运行结果:

输入100,输出100,用myscanf函数来输入

时间: 2024-10-31 20:23:06

C语言之可变参实现scanf函数的相关文章

嵌入式 C 语言的可变参数表函数的设计

首先在介绍可变参数表函数的设计之前,我们先来介绍一下最经典的可变参数表printf函数的实现原理.一.printf函数的实现原理在C/C++中,对函数参数的扫描是从后向前的.C/C++的函数参数是通过压入堆栈的方式来给函数传参数的(堆栈是一种先进后出的数据结构),最先压入的参数最后出来,在计算机的内存中,数据有2块,一块是堆,一块是栈(函数参数及局部变量在这里),而栈是从内存的高地址向低地址生长的,控制生长的就是堆栈指针了,最先压入的参数是在最上面,就是说在所有参数的最后面,最后压入的参数在最下

c语言scanf( )函数的一个问题

问题描述 c语言scanf( )函数的一个问题 #include int main() { int s; while(1) { printf("请输入:"); scanf("%d",&s); printf("%d ",s); } /*当给s从键盘接受字母的时候,该循环会出现不同, 原先(正常输入证书的时候)是等待你输入了s过后才 会输出结果,但现在(给s从键盘接受字母的时候)不 需要等待直接死循环下去. 我想请教各位长辈,这是什么原因导致

c语言scanf()函数的返回值

问题描述 c语言scanf()函数的返回值 c primer plus 一书中,199页的showchar2.c程序中有一行代码是if(scanf("%d %d",&rows,&cols)!=2),请问这里的scanf函数返回值的是参数的个数吗? 解决方案 http://blog.csdn.net/21aspnet/article/details/174326 解决方案二: c语言scanf返回值c语言中 scanf() 和printf()的返回值C语言中的printf

C语言Scanf函数

C语言的scanf函数 一.变量的内存分析 (一)字节与地址 ①. 内存以字节为单位 每个字节都有自己的内存地址,根据地址就可以找到该字节.整个内存相当于一整个酒店,而酒店以房间为单位,在这里每个房间就相当于是每个字节,地址就是房号,根据房号可以找到房间(根据地址也可以找到内存中的字节).相邻房间的房号是连续的,相邻字节的地址也是连续的.计算机中通常以十六进制表示地址. ②. 不同类型占用的字节是不一样的,数据越大则占用的字节数越多.如在64位编译器下,int类型占据4个字节,char类型占据1

详解C语言中scanf函数使用的一些注意点_C 语言

 (一)基本介绍 Scanf是系统自带的函数,声明包含在stdio.h文件中,因此要是有该函数,必须加载#include<stdio.h>头文件.当执行到scanf函数时,程序就暂停等待用户输入,该函数只接受变量的地址,格式为&变量名.是一个阻塞式的函数,2用户输入完毕后,则将值赋值给变量,至此函数调用完毕.敲回车键告知计算机键入完毕. (二)使用注意 ①. 使用scanf函数输入一个字符变量.Char a; scanf("%c",&a); ②. 同时输入多

c语言问题-scanf函数输入问题

问题描述 scanf函数输入问题 为什么在scanf()函数中要输入多个转换说明符时,中间要加个空格,例如scanf("%s %s"......) 解决方案 不加空格怎么区分呢?比如 %s%s,你输入123,到底是12 3还是1 23或者是1 2,3忽略呢 解决方案二: 你如果想直接输入八进制,不得告诉计算机你的格式啊 解决方案三: %s这种接受字符串的操作尽量只写一个,其它的类型接受可以多写. 解决方案四: scanf函数里面的空格是没必要加的吧,运行的时自己输入需要加空格区分两个数

c语言-C语言中scanf函数问题

问题描述 C语言中scanf函数问题 #include<stdio.h> int main() { char a1[5],a2[5],a3[5],a4[5]; scanf("%s",a1); printf("END1"); scanf("%s",a2); printf("END2"); scanf("%s",a3); printf("END3"); scanf("%

c语言-scanf函数用%f读取double类型时,为什么会出现错误?

问题描述 scanf函数用%f读取double类型时,为什么会出现错误? 问题一: #include double power (double n,int p); int main (void) { double x,xpow; int exp; printf("Enter a number and the positive integer power"); printf("to which will be raised . enter q"); printf(&q

C语言“…”占位符及可变参数函数

C语言函数的参数传递总是固定了个数,那么有没有传递任意个数参数的方法呢?在C++中,函数重载提供了多种参数传递的解决办法,但也不是任意参数个数.事实上,C语言是提供任意数量参数的解决方案的. printf(),scanf()等就是这样一类可支持任意参数个数变量的函数,以下是printf的用法示例. 1 printf("%d",x); 2 printf("%f",y); 3 printf("Hello my name is %s", name);