《K&R》里贯穿全书的代码
1、getline(char s[], int lim)
调用结果:往参数数组中读入字符直到换行(即:读取一行)
返回值:参数数组所读入的字符串长度
在《c程序设计语言中》里使用频率特别高。
version 1:
int getline(char s[], int lim)
{
int c, i; for(i = ; i < lim - && (c = getchar()) != EOF && c != '\n'; ++ i)
s[i] = c;
if(c == '\n'){
s[i] = c;
++ i;
}
s[i] = '\0';
return i;
}
version 2:
int getline(char s[], int lim)
{
int c, i; i = ;
while(--lim > && (c=getchar()) != EOF && c != '\n')
s[i++] = c;
if(c == '\n') // 这里非常重要!
s[i++] = c;
s[i] = '\0';
return i;
}
2、atoi(char s[])
返回值:整型数
将字符串s转换为相应的整数类型
version 1:
int atoi(char s[])
{
int i, n; n = ;
for(i = ; s[i] >= '' && s[i] <= ''; ++ i)
n = * n + (s[i] - '');
return n;
}
version 2:
#include<ctype.h> int atoi(char s[])
{
int i, n, sign; for(i = ; isspace(s[i]); i ++)
;
sign = (s[i] == '-')? - : ;
if(s[i] == '+' || s[i] == '-')
i ++;
for(n = ; isdigit(s[i]); i ++)
n = * n + (s[i] - '');
return sign * n;
}
3、binsearch(int x, int v[], int n)
返回值:元素x在数组v[]中的下标(v[]数组内元素是升序的)
#include<stdio.h>
#define MAXLINE 7 int binsearch(int x, int v[], int n);
// unit test
main()
{
int a[MAXLINE] = {, , , , , , }; if(binsearch(, a, MAXLINE) == && binsearch(, a, MAXLINE) == )
printf("binsearch: pass\n");
else
printf("binsearch: error\n");
} int binsearch(int x, int v[], int n)
{
int low, high, mid; low = ;
high = n - ;
while(low <= high){
mid = (low + high) / ;
if(x < v[mid])
high = mid - ;
else if(x > v[mid])
low = mid + ;
else
return mid; // found match
}
return -; // no match
}
4、reverse(char s[])
倒置字符中s中各个字符的位置
#include<string.h> void reverse(char s[])
{
int c, i, j; for(i = , j = strlen(s)-; i < j; i++, j--){
c = s[i];
s[i] = s[j];
s[j] = c;
}
}
这段代码只是比较典型。
5、itoa(int n, char s[])
将数字n转换为字符串并保存到s中
void itoa(int n, char s[])
{
int i, sign; if((sign = n) < )
n = -n;
i = ;
do{
s[i++] = n % + '';
}while((n /= ) > );
if(sign < )
s[i++] = '-';
s[i] = '\0';
reverse(s);
}
代码简洁,逻辑清晰。
6、atof(char s[])
把字符串s转换为相对应的双精度浮点数
#include<ctype.h> double atof(char s[])
{
double val, power;
int i, sign; for(i = ; isspace(s[i]); i++)
;
sign = (s[i] == '-')? - : ;
if(s[i] == '+' || s[i] == '-')
i++;
for(val = 0.0; isdigit(s[i]); i++)
val = 10.0 * val + (s[i] - '');
if(s[i] == '.')
i++;
for(power = 1.0; isdigit(s[i]); i++){
val = 10.0 * val + (s[i] - '');
power *= 10.0;
}
return sign * val / power;
}
和atoi不同的是小数部分的处理
《K&R》里贯穿全书的代码的更多相关文章
- 编程语言教程书该怎么写: 向K&R学习!
原文地址:Lax Language TutorialsAndrew Binstock 每年在评审Jolt Awards图书的时候,我都会被一些语言教程类图书弄得心力交瘁.从这些年的评审经验来看,这些语 ...
- K&R《C语言》书中的一个Bug
最近在重温K&R的C语言圣经,第二章中的练习题2-2引起了我的注意. 原题是: Write a loop equivalent to the for loop above without us ...
- 主成分分析(PCA)及其在R里的实现
主成分分析(principal component analysis,PCA)是一种降维技术,把多个变量化为能够反映原始变量大部分信息的少数几个主成分.设X有p个变量,为n*p阶矩阵,即n个样本的p维 ...
- K&R C风格函数
前些天在看getopt源码, 一种前所未见的函数定义方法 int getopt(nargc, nargv, ostr) int nargc; char * const nargv[]; const c ...
- ANSI C 与 K&R C
C语言由Dennis M.Ritchie在1973年设计和实现.从那以后使用者逐渐增加.到1978年Ritchie和Bell实验室的另一位程序专家Kernighan合写了著名的<TheC Pro ...
- VS里统计整个解决方案代码行数的方法
VS里统计整个解决方案代码行数,在查找里输入正则表达式:b*[^:b#/]+.*$.如下图所示: 结果如下图所示:
- 学习K&R时初学者经常遇到的一个问题——EOF
学习K&R时初学者经常遇到的一个问题——EOF
- php文本里 php和html代码谁先执行谁啊
php文本里 php和html代码谁先执行谁啊 比如php里包含一个html文本,然后html代码里又包含了一个php文本,是按照谁先包含谁被服务器执行吗,即先执行php ,再执行里面的html,然后 ...
- 【收藏】轻松导出全民K歌里任何人录制的短视频(MV)、歌曲的方法
有一次想把她在全民K歌里唱过的所有歌下载到电脑上,然后合成一个视频.但不知道怎么导出全民K歌里的歌曲,经过各种百度Google终于找到了一个用起来很简单的工具.不仅可以下载保存任何人录制的歌曲,还可以 ...
随机推荐
- 支付宝C# RSA签名 报系统找不到指定的文件问题解决
做支付宝在线支付模块,安卓和苹果端都没为问题,服务器也能顺利的收到付款异步通知. 在做WEB端支付的时候遇到个奇怪的问题:本地localhost调试支付没问题,代码更新到服务器就出现了未将对象引用设置 ...
- 有趣的BAT
最近某个用到的第三方程序会产生很多日志文件在logs目录中,每天一个log文件,类似 2014-05-07001.log.日积月累这个目录文件数量非常多,手动清除还是比较麻烦的. 由于这个软件不是自己 ...
- Android Http请求方法汇总
[转] 原文 这篇文章主要实现了在Android中使用JDK的HttpURLConnection和Apache的HttpClient访问网络资源,服务端采用python+flask编写,使用Serv ...
- $(document).ready(function(){});
$(document).ready 里的代码是在页面内容都加载完才执行的,你直接写到script标签里,当页面加载完这个script标签就会执行里边的代码了,如果你标签里执行的代码调用了当前还没加载过 ...
- zepto源码--核心方法8(管理包装集)--学习笔记
继续包装集过滤的相关函数的介绍,今天介绍与父元素相关的函数,parent, parents, closest, offsetParent parent 获取对象集合中每个元素的直接父元素. 与上篇文章 ...
- Yii常用路径说明
原作者地址:http://www.kuitao8.com/20140520/2483.shtml //framework路径 Yii::getFrameworkPath(); //protected/ ...
- Javascript模块化编程(二):AMD规范 作者: 阮一峰
声明:转载自阮一峰的网络日志 这个系列的第一部分介绍了Javascript模块的基本写法,今天介绍如何规范地使用模块. (接上文) 七.模块的规范 先想一想,为什么模块很重要? 因为有了模块,我们就可 ...
- eclipse闪退
svn提交我的项目时,由于网络故障,提交不上去,一直checking.......,然后我强制关闭eclipse后重启,发现启动不了了,一点击,尝试打开的状态就突然没了,试了几次都这样,重启电脑打开还 ...
- http协议 301和302的原理及实现
一.来看看官方的说法: 301,302 都是HTTP状态的编码,都代表着某个URL发生了转移,不同之处在于: 301 redirect: 301 代表永久性转移(Permanently Moved) ...
- opencv实现图像邻域均值滤波、中值滤波、高斯滤波
void CCVMFCView::OnBlurSmooth()//邻域均值滤波 { IplImage* in; in = workImg; IplImage* out = cvCreateImage( ...