因为C语言的printf和scanf有很多种数据类型,今天我就先实现三种吧,分别是%s, %d, %a,
如何想要知道看如何实现double或者float浮点型的实现,
所有函数自己手动实现,这是最好的学习方式。
printf实现
#include "stdafx.h"
#include "stdio.h"
char * Itoa(char * pStr, const int & rInt);
int MyPrintf(const char * pFormat, ...);
int main(int argc, char* argv[])
{
MyPrintf("%a, %d%s %a", 'a', 12, "123", 'b');
return 0;
}
int MyPrintf(const char * pFormat, ...)
{
if(NULL != pFormat)
{
const int * pMove = (const int *)(&pFormat + 1);
char SzBuff[512] = "";
char * pSzBuff = SzBuff;
while('\0' != *pFormat)
{
if('%' == *pFormat)
{
++pFormat;
switch(*pFormat)
{
case 'a':
{
*pSzBuff++ = *((const char *)pMove++);
break;
}
case 's':
{
for(const char * pTemp = (const char *)(*pMove++); '\0' != (*pSzBuff++ = *pTemp++););
--pSzBuff;
break;
}
case 'd':
{
char Szbuff[32] = "";
Itoa(Szbuff, *pMove++);
const char * pTemp = Szbuff;
while('\0' != *pTemp)
{
*pSzBuff++ = *pTemp++;
}
break;
}
case '%':
{
*pSzBuff++ = '%';
}
default:
{
*pSzBuff++ = *pFormat;
break;
}
}
}
else
{
*pSzBuff++ = *pFormat;
}
++pFormat;
}
pSzBuff = SzBuff;
while('\0' != *pSzBuff)
{
putchar(*pSzBuff++);
}
return 0;
}
return -1;
}
void Ita(char * pStr, int nNum)
{
static char * pTemp;
pTemp =pStr;
if(nNum > 0)
{
Ita(pStr, nNum / 10);
*pTemp++ = nNum % 10 + '0';
}
*pTemp = '\0';
}
char * Itoa(char * pStr, const int & rInt)
{
if(rInt ==0)
{
*pStr++ = '0';
*pStr = '\0';
}
else if(rInt > 0)
{
Ita(pStr, rInt);
}
else
{
*pStr = '-';
Ita(pStr + 1, -rInt);
}
return pStr;
}
Scanf
// MyScanf.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "stdio.h"
void GetString(char * pStr);
int Atoi(const char * pStr);
int MyScanf(const char * pFormat, ...);
int main(int argc, char* argv[])
{
int i;
char ch;
char SzBuff[32];
MyScanf("%d,%a, %s", &i, &ch, SzBuff);
return 0;
}
int MyScanf(const char * pFormat, ...)
{
if(NULL != pFormat)
{
const int * pMove = (const int *)(&pFormat + 1);
while('\0' != *pFormat)
{
if('%' == *pFormat)
{
++pFormat;
switch(*pFormat)
{
case 'a':
{
**((char **)pMove++) = getchar();
break;
}
case 'd':
{
char Szbuff[32] = "";
GetString(Szbuff);
**((int **)pMove++) = Atoi(Szbuff);
break;
}
case 's':
{
char Szbuff[128] = "";
GetString(Szbuff);
const char * pRcs = Szbuff;
char * pTemp = (char *)(*pMove++);
while('\0' != (*pTemp++ = *pRcs++));
break;
}
default:
{
++pFormat;
break;
}
}
}
++pFormat;
}
return 0;
}
return -1;
}
void GetString(char * pStr)
{
if(NULL != pStr)
{
char ch = ' ';
while('\n' == ch || ' ' == ch)
{
ch = getchar();
}
*pStr++ = ch;
ch = getchar();
while('\n' != ch && ' ' != ch)
{
*pStr++ = ch;
ch = getchar();
}
*pStr = '\0';
}
}
int Atoi(const char * pStr)
{
int nSum = 0;
bool Is_Negative = false;
if(NULL != pStr)
{
if('-' == *pStr)
{
Is_Negative = true;
++pStr;
}
while(NULL != *pStr)
{
nSum = nSum * 10 + *pStr - '0';
++pStr;
}
}
if(Is_Negative)
{
return -nSum;
}
else
{
return nSum;
}
}