《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终于找到了一个用起来很简单的工具.不仅可以下载保存任何人录制的歌曲,还可以 ...
随机推荐
- SPARK支持的常见文件格式
SequenceFile读写文件Scala\java类型对应表
- libgdx actor 透明问题
遇到一个问题,自定义的Actor在使用batch.draw时,其他Actor设置的透明影响到了这个Actor 处理方法为 在自定义Actor中 draw方法中 绘制前,加入 Color color = ...
- SQLSERVER2012 附加数据库重名的问题
SQL2012附加数据库时如何更改数据库名称呢 方法一: 在“附加为”那一栏填写新的数据库名称就可以 方法二: 使用脚本 附加时点击脚本会自动生成附加脚本 直接修改database的名称即可!
- 多线程 - CyclicBarrier
一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point).在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarri ...
- Inside Flask - signal 信号机制
Inside Flask - signal 信号机制 singal 在平常的 flask web 开发过程中较少接触到,但对于使用 flask 进行框架级别的开发时,则必须了解相关的工作机制.flas ...
- 函数类型+WINAPI+函数名(例如inline DWORD static WINAPI RecordToKeys(const DRWT& theDRWT,WTSBH* pKey,DWORD dwMaxNum)
winapi标识符在WINDEF.H定义,语句如下: #define winapi __stdcall 让我们说说这个__stdcall stdcall调用约定 stdcall很多时候被称为pasca ...
- AndroidStudio第一个项目HelloWorld
实验内容 在Android Studio中创建项目 创建并启动Android模拟器 项目的编译和运行 实验要求 在安装好的AndroidStudio上建立第一个工程 创建并启动Android模拟器 编 ...
- Scala 流程空间,函数,异常处理
1,)首先留意一下下边的代码块,他是怎么运行的,貌似在c#中他是出错的,不应该出现这样的写法的,但在scala中侧不然: package com.dt.study /** * The package ...
- 完全偶图K(3,3)与完全图K5是否存在平面表示
本文论述k(3, 3)与K5平面表示的存在性.首先给出图的平面表示的定义: 若可以在平面里画出一个图而让边没有任何交叉(边的交叉是指边的直线或弧线在它们的公共端点以外的地方相交),则这个图是平面性的. ...
- Python 迭代器&生成器
1.内置参数 Built-in Functions abs() dict() help() min() setattr() all() dir() hex() next() slice ...