专栏首页米扑专栏C语言部分函数原型实现

C语言部分函数原型实现

学习、研究库函数的实现,能使你考虑问题更加严谨、全面,培养良好的编程风格和习惯

最近想学习一下C语言库函数的内部实现,于是自己简单地写了几个

贴出以下代码,希望大家能够帮忙指正、优化、完善,

特别是考虑不周和执行效率上给出指导意见

阅读本文前,可以先参考本博客的上一篇文章 C语言函数小集合

调试环境: VS2008(C)

// sysFunc.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <ctype.h>
/**************************************/
/**********     isalnum()     *********/
/**************************************/
int m_isalnum(char ch)
{
	return ((ch<='9'&&ch>='0')
			||(ch<='z'&&ch>='a')
			||(ch<='Z'&&ch>='A')); 
}
void fun_isalnum()
{
	char str[]="A12a;D*s06";
	int i;
	printf("Test isalnum.: %s/n", str);
	for(i=0; str[i]!=NULL; i++) /* #define NULL 0 */
	{
		if(m_isalnum(str[i])) /* isalnum(str[i]) */
			printf("%c is a number or character./n", str[i]);
	}
}
/**************************************/
/**********     isalpha()     *********/
/**************************************/
int m_isalpha(char ch)
{
	return ((ch<='z'&&ch>='a')
			||(ch<='Z'&&ch>='A')); 
}
void fun_isalpha()
{
	char str[]="A12a;D*s06";
	int i;
	printf("/nTest isalpha: %s/n", str);
	for(i=0; str[i]!='/0'; i++)
	{
		if(m_isalpha(str[i])) /* isalpha(str[i]) */
			printf("%c is a character./n", str[i]);
	}
}
/**************************************/
/**********     islower()     *********/
/**************************************/
int m_islower(char ch)
{
	return (ch<='z'&&ch>='a');
}
void fun_islower()
{
	char str[]="A12a;D*s06";
	int i;
	printf("/nTest islower: %s/n", str);
	for(i=0; str[i]!='/0'; i++)
	{
		if(m_islower(str[i])) /* isalpha(str[i]) */
			printf("%c is a lower character./n", str[i]);
	}
}
/**************************************/
/**********     isupper()     *********/
/**************************************/
int m_isupper(char ch)
{
	return (ch<='Z'&&ch>='A');
}
void fun_isupper()
{
	char str[]="A12a;D*s06";
	int i;
	printf("/nTest isupper: %s/n", str);
	for(i=0; str[i]!='/0'; i++)
	{
		if(m_isupper(str[i])) /* isalpha(str[i]) */
			printf("%c is a isupper character./n", str[i]);
	}
}
/**************************************/
/**********     isxdigit()    *********/
/**************************************/
int m_isxdigit(char ch)
{
	return (ch<='9'&&ch>='0');
}
void fun_isxdigit()
{
	char str[]="A12a;D*s06";
	int i;
	printf("/nTest isxdigit: %s/n", str);
	for(i=0; str[i]!='/0'; i++)
	{
		if(m_isxdigit(str[i])) /* isalpha(str[i]) */
			printf("%c is a isxdigit character./n", str[i]);
	}
}
/**************************************/
/**********     tolower()     *********/
/**************************************/
char m_tolower(char ch)
{
	if(ch<='Z'&&ch>='A')
		return (ch+'a'-'A');
	return '0';
}
void fun_tolower()
{
	char str[]="A12a;D*s06";
	int i;
	char ch; 
	printf("/nTest tolower: %s/n", str);
	for(i=0; str[i]!='/0'; i++)
	{
		ch=str[i];
		if(m_isalpha(ch)) /* isalpha(str[i]) */
		{
			if(ch<='Z'&&ch>='A')
				ch=m_tolower(ch);
			printf("%c is a tolower character./n", ch);
		}
	}
}
/**************************************/
/**********     toupper()     *********/
/**************************************/
char m_toupper(char ch)
{
	if(ch<='z'&&ch>='a')
		return (ch+'A'-'a');
	return '0';
}
void fun_toupper()
{
	char str[]="A12a;D*s06";
	int i;
	char ch;
	printf("/nTest toupper: %s/n", str);
	for(i=0; str[i]!='/0'; i++)
	{
		ch=str[i];
		if(m_isalpha(ch)) /* isalpha(str[i]) */
		{
			if(ch<='z'&&ch>='a')
				ch=m_toupper(ch);
			printf("%c is a toupper character./n", ch);
		}
	}
}
/**************************************/
/**********       atoi()      *********/
/**************************************/
int m_atoi(char *str)
{
	char *s=str;
	int sum=0, flag=1;
	if(*s==NULL)
		return 0;
	while(*s==' ') /* skip space */
		s++; 
	if(*s=='-')
	{
		flag=-1;
		s++;
	}
	while(*s!='/0' && m_isxdigit(*s))
	{
		sum=*s-'0'+sum*10;
		s++;
	}
	
	return flag*sum;
}
void fun_atoi()
{
	char str[]="   -123.456def";
	printf("/nTest atoi.../n");
	printf("%s char to int: %d/n", str, m_atoi(str));
}
/**************************************/
/**********       itoa()      *********/
/**************************************/
void m_itoa(int n)
{
	char *s=NULL;
	int i, j, mod, flag=0;
	char num[20];
	if(n<0) 
	{
		flag=1;
		n=-n;
	}
	i=0;
	do 
	{
		mod=n%10;
		n=n/10;		
		num[i++]=mod+'0';
	} while (n>0);
	
	if(flag) /* print '-' */
		printf("-");
	for(j=i-1; j>=0; j--) /* print reverse char */
	{
		printf("%c", num[j]);
	}
}
void fun_itoa()
{
	int n=1234;
	printf("/nTest itoa.../n");
	printf("%d char to int: ", n);
	m_itoa(n);
	printf("/n");
}
/**************************************/
/**********       atof()      *********/
/**************************************/
float m_atof(char *str)
{
	char *s=str;
	if(*s=='/0')
		return 0.0;
	
	float sum=0.0;
	int flag=1, pow=0;
	if(*s=='-')
	{
		flag=-1;
		s++;
	}
	while(*s!='/0')
	{
		if(*s=='.') /* dot */
		{
			pow=1;
			s++;
			continue;
		}
		sum=*s-'0'+sum*10;
		pow*=10;
		s++;
	}
	return flag*sum/pow;
}
void fun_atof()
{
	char str[]="-123.345";
	printf("/nTest atof.../n");
	printf("%s char to int: %f/n", str, m_atof(str));
}
/**************************************/
/**********       ftoa()      *********/
/**************************************/
void m_ftoa(float n)
{
	char num[20];
	int i, j, val, mod, flag, pow;
	float dot;
	if(n<-1e-6)
	{
		flag=1;
		n=-n;
	}
	i=0;
	val=(int)n; /* integer */
	dot=n-val;  /* decimal */
	do
	{
		mod=val%10;
		val=val/10;
		num[i++]=mod+'0';
	}while(val>0);
	if(dot>1e-6)
	{
		num[i]='.';
		pow=10;
	}
	do 
	{
		dot=dot*pow;
		mod=(int)dot;
		num[i++]=mod+'0';
		dot=dot-mod; /* error, why, float... help me */
	} while (dot>1e-6);
	if(flag)
		printf("-");
	for(j=i-1; j>=0; j--)
		printf("%c", num[j]);
}
void fun_ftoa() 
{
	float n=-1234.5678;
	printf("/nTest ftoa.../n");
	printf("%d char to int: ", n);
	m_ftoa(n);
	printf("/n");
}
/**************************************/
/**********       main()      *********/
/**************************************/
int _tmain(int argc, _TCHAR* argv[])
{
	fun_isalnum();
	fun_isalpha();
	fun_islower();
	fun_isupper();
	fun_isxdigit();
	fun_tolower();
	fun_toupper();
	fun_atof();
	fun_atoi();
	fun_itoa();
	fun_ftoa();
	return 0;
}

运行结果:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【leetcode】Valid Palindrome

    Given a string, determine if it is a palindrome, considering only alphanumeric c...

    阳光岛主
  • Linux 抓取网页方式(curl+wget)

    curl 和 wget 命令,目前已经支持Linux和Windows平台,后续将介绍。

    阳光岛主
  • 【leetcode】Plus One

    Given a number represented as an array of digits, plus one to the number.

    阳光岛主
  • 还在增删改查?如何在工作中提升技术水平

    互联网行业996已是见怪不怪的问题,在这背后大家常常讨论的是被老板压榨的时间,导致自己没有办法看书学习,扩宽自己的知识面。不管这工作外的8小时是不是用来学习,总...

    微笑的小小刀
  • 基础练习 十六进制转八进制

    输入格式   输入的第一行为一个正整数n (1<=n<=10)。   接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整...

    AI那点小事
  • LeetCode - 翻转图像

    原题地址:https://leetcode-cn.com/problems/flipping-an-image/

    晓痴
  • Go语言中的管道(Channel)总结

    管道(Channel)是Go语言中比较重要的部分,经常在Go中的并发中使用。今天尝试对Go语言的管道来做以下总结。总结的形式采用问答式的方法,让答案更有目的性。...

    李海彬
  • 算法训练 字串统计

    问题描述   给定一个长度为n的字符串S,还有一个数字L,统计长度大于等于L的出现次数最多的子串(不同的出现可以相交),如果有多个,输出最长的,如果仍然有多...

    AI那点小事
  • Koa 框架教程

    Node 主要用在开发 Web 应用。这决定了使用 Node,往往离不开 Web 应用框架。 ? Koa就是一种简单好用的 Web 框架。它的特点是优雅、简洁、...

    企鹅号小编
  • 深度学习应用大盘点

    当首次介绍深度学习时,我们认为它是一个要比机器学习更好的分类器。或者,我们亦理解成大脑神经计算。 第一种理解大大低估了深度学习构建应用的种类,而后者又高估了它的...

    CSDN技术头条

扫码关注云+社区

领取腾讯云代金券