读经典之TCPL练习五

《算法第四版》学习心得一——怎么学算法  一、算法的两个核心 算法的核心内容实际上有两个: 算法的概念和思路。 算法的编程实现。 两者相互关联影响,缺一不可。 不理解基本概念和思路,就算把实现代码背下来,也无济于事,因为脑袋里依然是一片模糊。理解了概念和思路,不去用代码实现,脑袋里有的只是概念,无法根据真实需求实现解决方案。 二、学算法需要什么基础 首先,必须要有一定的编程语言基础,要理解语言中最基本的概念:数据类型,类,成... 阅读详情



1.实现库函数 strncpy、strncat 和 strncmp,它们最多对参数字符串中的前 n 个字符进行操作。例如,函数 strncpy(s, t, n)将 t 中最多前 n 个字符复制到 s中。


strncpy函数


我自己写的:

	void strncpy(char *s,const char *t,int n) {
		char *tmp;
		tmp=t;

		for(;t<(tmp+n);s++,t++)
			*s=*t;
	}

网上看到的:
char *my_strncpy(char *dest, const char *src, int count)  
{  
    char *tmp = dest;  
    while(count) {  
        if ((*tmp = *src) != 0)  
            src++;  
        tmp++;  
        count--;  
    }  
    return dest;  
}  

书上看到的答案:

char *liw_strncpy(char *s, const char *ct, size_t n) {
char *p;
p = s;
for (; n > 0 && *ct != '\0'; --n)
*p++ = *ct++;
for (; n > 0; --n)
*p++ = '\0';
return s;
}

网上看到的和书上的答案思路是相同的只是实现不同,顿时感觉我的程序难以入眼。

man strncpy 查看一下原型(这个应该和平台有关--Ubuntu)

char *strncpy(char *dest, const char *src, size_t n)
           {
               size_t i;

               for (i = 0; i < n && src[i] != '\0'; i++)
                   dest[i] = src[i];
               for ( ; i < n; i++)
                   dest[i] = '\0';

               return dest;
           }
感觉这样的程序算不上特别好,或许真的跟平台有关。

dest的长度必须足够容纳src,否则出现意想不到的结果
测试1:

dest:1234567

src:abcdef

n:3

结果:abc4567

测试2:

dest:12345

src:abcdefg

n:7

结果:abcdefg


strncat


自己写的:

	void strncat(char *s,const char *t,int n) {
		 char *tmp;
		tmp=t;
		while(*s)
			s++;
		for(;t<(tmp+n)&&*t;t++,s++)
			*s=*t;
	}

书上的答案:

<span style="font-size:18px;">char *liw_strncat(char *s, const char *ct, size_t n) {
char *p;
p = s;
while (*p != '\0')
++p;
for (; n > 0 && *ct != '\0'; --n)
*p = '\0';
return s;
}</span>


man 3 strncat得到的:

char *strncat(char *dest, const char *src, size_t n)
           {
               size_t dest_len = strlen(dest);
               size_t i;

               for (i = 0 ; i < n && src[i] != '\0' ; i++)
                   dest[dest_len + i] = src[i];
               dest[dest_len + i] = '\0';

               return dest;
           }


测试:

dest:12345

src:abcd

n:3

结果:12345abc


strncmp

首先说明一下这个函数的作用是将s,t字符串的前n个字符左比较,而不是将t的前n个字符和s字符串比较(我以为是后一种)

int strncmp(const char *s,const char *t,int n) {
		while(n>0 && *s==*t && *s!='\0') {
			s++;
			t++;
			n--;
		}
//n==0的情况可能类似:abcef 1234567 5; *s==*t的情况则类似于:abcef 12345 5 
		if(n==0|| *s==*t)
			return 0;
		if( *(unsigned char *)s < *(unsigned char *)t )
			return -1;
		return 1;
	}

man 3 strncmp没有看到有源码

网上找到一个还不错

int strncmp ( char * s1, char * s2, size_t n)
{
  while (--n && *s1 && *s1 == *s2)
  {
  <span style="white-space:pre">	</span>s1++;
  <span style="white-space:pre">	</span>s2++;
  }
  return (*s1-*s2);
}
这其实跟上面的差不多,至于后面的处理可以把上面的拿下来。


测试:

s1:123456

s2:1234567

n;6

结果:0


s1:123456

s2:1234567

n:7

结果:-1


总结:主要是简单的指针使用,三个函数的实现都采用相同的思路。自己的程序不足主要体现在程序的"附加值“不够,应该在程序的后面返回一个指针方便程序的使用和扩展。




        

2. 采用指针而非数组索引方式改写前面章节和练习中的某些程序,例如getline(第 1、4 章),atoi、itoa 以及它们的变体形式(第 2、3、4 章),reverse(第3 章),strindex、getop(第 4 章)等等。


注意c中也有getline函数

  getline()第一版本--函数返回的是整行的长度

<span style="font-size:18px;">int getline(char s[],int lim) {
		int c,i;

		for(i = 0;i < lim -1 && (c = getchar()) != EOF && c != '\n';++i)
			s[i] = c;
		if(c == '\n') {
			s[i] = c;
			++i;
		}
		s[i] = '\0'; /*'\0'以标志字符串的结束。c规定该类型的字符串常量将以字符数组的形式存储*/
		return i;
	}</span>

第二版本
<span style="font-size:18px;">int getline(char s[], int lim)
{
    int c, i;
    i = 0;
    while (--lim > 0 && (c=getchar()) != EOF && c != '\n')
        s[i++] = c;
    if (c == '\n')
         s[i++] = c;
    s[i] = '\0';
    return i;
}</span>

指针版本:


<span style="font-size:18px;">int getline(char *s,int lim) {
		char *tmp;
		int c;

		 tmp=s;

		while(--lim>0 && (c=getchar())!=EOF && c!='\n')
			*tmp++=c;
		if(c=='\n')
			*tmp++=c;
		*tmp='\0';

		return (int)(tmp-s);
	}
</span>


atoi函数 将字符串转换为对应数值的函数 atoi,它可以处理可选的前导空白符以及一个可选的加 (+)或减(-)号.


<span style="font-size:18px;">int atoi(char s[])
	{
		int i,n,sign;
		
		for(i=0;isspace(s[i]);i++)
			;
		sign=(s[i]=='-') ? -1:1;
		
		if(s[i]=='+' || s[i]=='-')
			i++;
		
		for(n=0;isdigit(s[i]);i++)
			n=n*10 + (s[i]-'0');

		return sign*n;
	}</span>

我写的指针版本(思路跟上面的没有区别):
<span style="font-size:18px;">	int atoi(char *s) {
		int n,sign;

		for(;isspace(*s);s++)
			;
		sign=(*s=='-')?-1:1;
		if(*s=='+' || *s=='-')
			s++;

		for(n=0;isdigit(*s);s++)
			n=n*10 + (*s-'0');

		return sign*n;
	}</span>

答案版本:
<span style="font-size:18px;">int atoi(char *s)
{
    int n, sign;
    while (isspace(*s))
       s++;
    sign = (*s == '+' || *s == '-') ? ((*s++ == '+') ? 1 : -1) : 1; //这一句比较有意思,三木运算符的重叠
    for (n = 0; isdigit(*s); s++)
        n = (n * 10) + (*s - '0'); 

    return sign * n;
}</span>

  itoa



resverse()  将字符串的顺序翻转。

<span style="font-size:18px;">	void resverse(char s[]) {
		int i,j;
		char tmp;

		for(i=0,(j=strlen(s)-1);i<j;i++,j--) {
			tmp=s[i];
			s[i]=s[j];
			s[j]=tmp;
		}
	}</span>

我写的:
<span style="font-size:18px;">	void resverse(char *s) {
		char *p;
		char tmp;
		for(p=(s+strlen(s)-1);s<p;s++,p--) {
			tmp=*s;
			*s=*p;
			*p=tmp;
		}
	}</span>

答案的版本感觉不好就不贴了。



strindex()  该函数返回字符串 t 在字符串 s 中出现的起始位置或索引。当 s 不包含 t 时,返回值为-1。

版本1:

<span style="font-size:18px;">int strindex(char source[],char pattern[]) {
		int i,j,k;
                //遍历source每个字符与pattern中的每个字符比较
		for(i=0;source[i] != '\0';i++) {
			for(j=i,k=0;pattern[k] != '\0' && pattern[k] == source[j];k++,j++) 
				;
			if(k>0 && pattern[k] == '\0')  //当条件满足时说明出现了连续匹配的情况
				return i;
		}

		return -1;
	}</span>


仿照上面修改的指针版本:

<span style="font-size:18px;">int strindex(char *s,char *p) {
		char *tmp;
		while(*s) {
			s++;
			for(tmp=s;*p !='\0' && *p==*tmp;p++,tmp++)
				;
			if(*p=='\0')
				return (int)(tmp-s);
		}
		return -1;
	}</span>

答案版本(这里将查找有可能匹配的位置的功能独立出来,中英文注释都是我写的^_^)

<span style="font-size:18px;">//find out a char match the fist char of pattern and then return the location
	static char *strchar(char *s,int c) {
		char ch=c;
		
		for(;ch!=*s;s++)
			if(*s=='\0')
				return NULL;
		return s;
	}
	
	int strindex(char *s,char *p) {
		char *u,*v,*w;
		//when the pattern string is NULL
		if(*s=='\0') 
			return 0;
		//一旦有在s中出现和p中的第一个字符相同的就进入继续匹配
		for(u=s;(u=strchar(u,*p))!=NULL;u++) {
			for(v=u,w=p; ;)
				//但到最后一个字符时即匹配成功
				if(*++w=='\0')
					return (int)(u-s);
				//当发现有下一个字符不匹配就跳出循环
				else if(*++v !=*w)
					break;
		}
		//when the source don't contain the pattern string
		return -1;
	}</span>


getop中也可以相应的修改用数组可指针表示元素,和指针的自增即可就不贴代码了。


总结:指针很强大。




3.在给定可选参数-n 的情况下,该函数将按数 值大小而非字典顺序对输入的字符串行进行排序


/*
	date:9-5-2014
	author:doodlesomething
	version:1.1

	sort -n

排序函数(排序字符串),在给定可选参数-n 的情况下,该函数将按数值大小而非字典顺序对输入行进行排序
排序程序通常包括 3 部分:判断任何两个对象之间次序的比较操作、颠倒对象次序的交
换操作、一个用于比较和交换对象直到所有对象都按正确次序排列的排序算法。由于排序算
法与比较、交换操作无关,因此,通过在排序算法中调用不同的比较和交换函数,便可以实
现按照不同的标准排序
*/

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAXLEN 1000
#define MAXLINES 1000
#define MAXBUFPSIZE 10000

char *lineptr[MAXLINES];


int main(int argc,char *argv[]) {
	int readlines(char *lineptr[],int lim);
	void quicksort( void *lineptr[],int left,int right,int (*comp)(void *,void *) );
	void writelines(char *lineptr[],int nlines);
	int numcmp(const char *s1,const char *s2);
	int nlines;
	int isnum; //flag

	isnum = 0;
	//带有-n参数
	if(argc > 1 && strcmp(argv[1],"-n") == 0 ) {
		isnum=1;
	}
	

	if( (nlines = readlines(lineptr,MAXLINES) ) > 1) {
		/*
		(int (*) (void *,void *))  (isnum?numcmp:strcmp )  表示将 numcmp或是strcmp
		强制类型转换为 指针类型 ,该指针指向一个带有两个void型的指针,且该函数返回int的数值
		即最后其是一个指针
		(void**) lineptr 不明白 ---》望指点
		*/
		quicksort( (void**) lineptr,0,nlines-1, (int (*)(void *,void *) ) (isnum ? numcmp:strcmp ) );
		writelines(lineptr,nlines);
	}
	else {
		printf("Something wrong");
	}

	return 0;
}
	/*
	将单行收集,并用指针数组的方式存储
	*/
	int readlines(char *lineptr[],int lim) {
		int len;
		char line[MAXLEN];
		char *p;
		int nlines;
		int getLine(char *s,int lim);
		char *alloc(int n);

		nlines=0;

		while( (len = getLine(line,MAXLEN) ) >0 ) {
			if( nlines>lim || (p=alloc(len)) == NULL ) {
				return -1;
			}
			else  {
				line[len-1]='\0';
				strcpy(p,line);
				lineptr[nlines++]=p;
			}
		}

		return nlines;
	}

	/*
	排序:快速排序法
	*/
	void quicksort(void *lineptr[],int left,int right, int (*comp) (void *,void *) ) {

		int i,last;

		void swap(void *v[],int i,int j);

		if(left >= right) 
			return;
		swap(lineptr,left,(left+right)/2 );
		
		last = left;
		//找到last的位置
		for(i = left+1;i <= right;i++ ) {
			if( (*comp)(lineptr[i],lineptr[left]) < 0 ) {
				swap(lineptr,++last,i);
			}
		}

		swap(lineptr,left,last);
		quicksort(lineptr,left,last-1,comp);
		quicksort(lineptr,last+1,right,comp);
	}
	
	/*
	这里之所以将函数参数声明为const主要是因为 三目运算符要求参数类型一致,
	strcmp原型为 int strcmp(const char *s1,const char *s2) 当然也可增加安全性
	*/
	int numcmp(const char *s1,const char *s2) {
		double v1,v2;

		v1=atof(s1);
		v2=atof(s2);

		if(v1<v2)
			return -1;
		else if(v1>v2)
			return 1;
		else 
			return 0;
	}
	//交换两元素指针,以减少内存开销和元素的移动
	void swap(void *v[],int i,int j) {
		void *tmp;
		tmp=v[i];
		v[i]=v[j];
		v[j]=tmp;
	}

	//获取单行
	int getLine(char *s,int lim) {
		char *tmp;
		int c;

		tmp=s;

		while(--lim > 0 && (c=getchar()) !=EOF && c != '\n') 
			*tmp++ = c;
		if(c == '\n')
			*tmp++ = c;
		*tmp = '\0';

		return (int) (tmp-s);
	}

	void writelines(char *lineptr[],int nlines) {
		printf("\n");

		while( (nlines--) > 0) {
			printf("%s\n",*lineptr++);
		}
	}


	//缓冲区
	static char buf[MAXBUFPSIZE];
	//栈顶指针
	static char *bufp=buf;

	//ask for stack
	char *alloc(int n) {
		if(n > 0 && (buf+MAXBUFPSIZE-bufp) > n ) {
			bufp=bufp+n;
			return bufp-n;
		}
		else {
			return -1;
		}
	}





微信小程序 - 最新详细实现用户保存下载视频到手机相册,将视频临时路径、在线播放地址(网络路径)URL存储到手机,弹出访问手机相册权限询问,支持视频格式mp4、avi、mov、wmv、flv、webm 微信小程序,视频,手机相册,保存,另存为,小程序保存到相册权限,writePhotosAlbum,一键保存视频到手机相册功能(视频来源为链接),第一次要获取用户授权,授权使用相册权限,小程序视频下载,如何把视频下载到相册,下载一个视频到本地相册,显示下载进度,可取消下载,视频下载到本地,微信小程序视频如何下载,保存视频到相机,页面播放视频并下载到本地,安卓系统,苹果ios保存到相册报错,权限拒绝后打不开,添加相册授权弹框拒绝后再也出不来了,实现保存视频到手机相册功能,将mp4在线视频下载并存储到用户的手机中 阅读详情

相关推荐

Zephyr 开发必备技能:一文搞懂 west manifest

本文深入解析Zephyr项目的westmanifest工具与Manifest文件管理,从基础概念到高级应用。文章首先介绍westmanifest作为Zephyr模块化架构的核心工具,负责管理west.yml文件中的模块信息、Git地址及版本控制。随后详细讲解Manifest文件的基本结构、字段含义,以及westmanifest子命令的使用方法,包括查看内容、冻结版本、验证文件等操作。文章还探讨了Manifest的导入继承机制和在团队协作中的版本管理策略,并给出常见问题排查技巧。最后强调Manifest文件作

hemoparrot的专栏 1255

写一个strncpy函数(前n个字符串复制函数)

写一个strncpy函数

m0_68038554的博客 289

具身智能端侧硬件选型实战:从算力需求到芯片对比与避坑指南

在边缘计算和嵌入式AI快速发展的今天,端侧智能设备的落地不再单纯比拼芯片的标称算力。TOPS数值只是初筛指标,真实的推理性能还受内存带宽、数据精度、稀疏性以及散热功耗等多重因素制约。理解不同视觉感知、决策规划与语言交互任务对算力的差异化需求,是选型的第一步。本文从技术原理出发,剖析了Jetson Orin、地平线征程、RK3588等主流平台的实测表现,并揭示了散热设计、供电链路与软件生态这三个极易被忽略的隐形瓶颈。通过完整的部署调优实录,展示了量化、缓存与电源模式优化如何提升端侧推理效率,为具身智能、无人车

weixin_29164185的博客 362

strncpy(s, t, n) strncat(s, t, n) strncmp(s, t, n)对字符串的前n个字符进行操作

《C程序设计语言》5-5 题目:实现库函数strncpy  strncat  strncmp,它们最多对参数字符串中的前N个字符进行操作。例如:函数strncpy(s, t, n) 将t中最多前n个字符复制到s中。 #include &lt;stdio.h&gt; /*对字符串中的前n个字符进行操作*/ void strncpy(char *, char *, int); void strnc...

yjysunshine的博客 1270

通俗易通解释SLAM问题的数学描述:运动方程和观测方程

高翔博士在他的《视觉SLAM十四讲》中把SLAM问题的数学描述抽象成了两个数学方程,以下对此做个总结,并且对此做一些通俗易懂的解释: 一、方程的总体形式 作为理性层次的描述,我们引入数学方程来描述SLAM过程,其中第一个方程叫做运动方程、第二个方程叫做观测方程,想象一下我们在研究SLAM的时候肯定需要观测机器人(无人汽车、无人机等都可以统称为机器人)的运动(画面感很强哈哈),这样很容易理解并且记忆这两个方程的名称和意义: 二、变量的含义 我们看到,这两个方程中有大量的英文字母作为变量存在其中,下面介绍一下

weixin_41855010的博客 7110

RV1126上YOLOv8部署实战:从模型转换到板端推理的完整避坑指南

本文提供了在瑞芯微RV1126芯片上部署YOLOv8目标识别算法的完整实战指南。内容涵盖从模型转换、环境搭建到板端推理代码编写的全流程,重点解析了RKNN-Toolkit使用、量化配置、内存优化及后处理实现等关键环节的常见问题与解决方案,旨在帮助开发者高效避坑,实现边缘AI应用的稳定落地。

pz89012345的博客 567

c语言字符串拷贝,C语言strncpy()函数:复制字符串的前n个字符

头文件:#include strncpy()用来复制字符串的前n个字符,其原型为:char * strncpy(char *dest, const char *src, size_t n);【参数说明】dest 为目标字符串指针,src 为源字符串指针。strncpy()会将字符串src前n个字符拷贝到字符串dest。不像strcpy(),strncpy()不会向dest追加结束标记'\0',这就...

weixin_28984379的博客 2891

Windows10完美驱动Apple Studio Display全攻略:从雷电转接到亮度调节(附N卡兼容列表)

本文详细介绍了在Windows10系统下如何完美驱动Apple Studio Display显示器,包括雷电接口转接方案、BootCamp驱动安装及NVIDIA显卡兼容性测试。特别推荐GTX 1660 Super等显卡,提供5K@60Hz稳定输出,并分享色彩管理及日常使用技巧,帮助用户充分发挥这款苹果显示器的性能。

weixin_29284657的博客 1088

The C Programming Language(第 2 版) 笔记 / 7 输入与输出 / 7.8 其它函数

参考文献:The C Programming Language目录标准库提供了很多功能各异的函数,本节将对其中特别有用的函数做一个简要的概述 更详细的信息以及其它许多没有介绍的函数请参见附录 B前面已经提到过字符串函数 、、 和 都在头文件 中定义 在下面的各个函数中, 与 为 类型, 与 为 类型头文件 中定义了一些用于字符测试和转换的函数 在下面各个函数中, 是一个可表示为 类型或 的 对象 该函数的返回值类型为 标准库提供了一个称为 的函数,它与第 4 章中编写的函数 相比功能

菜鸟的博客 210

Open3D 点到面的ICP配准算法【2025最新版】

点到面的ICP(python版本)博客长期更新,本文最近一次更新时间为:2025年2月2日,代码已更新至Open3D 0.18.0版本。

点云侠的博客 38万+

雷达参数的设置

采样率又可以叫做采样速率或者,顾名思义就是每秒采集的次数。该值越高,单位时间内对信号的采集越多,采样率的单位可以用Hz或者sps表示(sps是采样率,是每秒采样点的数量,sp表示采样点数),一般1sps=1Hz。采样时间是采样点数和采样周期的乘积得到的结果。假设实际采样率为4560ksps,采样点数为256,那么采样周期为1/4560(ms),那么ADC的采样时间就为256*(1/4560)(ms)=0.056ms=56微秒。

qq_50974341的博客 1912

《C程序设计语言》(《The C Programming Language》)第二版第五章练习题

5-1: 在上面的例子中,如果符号+或-的后面紧跟的不是数字,getint函数将把符号视为数字0的有效表达式。修改该函数,讲这种形式的+或-符号重新写会到输入流中 #include <stdio.h> #include <ctype.h> #define BUFSIZE 100 int buf[BUFSIZE]; int bufp = 0; int getch(voi...

m0_46655998的博客 1462

【24E】SWT6652 wifi驱动加载失败问题分析及解决方案

修改驱动配置Kconfig。是由于内存分配失败导致。

wgl307293845的博客 219

读经典之TCPL练习四

练习 5-14 修改排序程序,使它能处理-r 标记。该标记表明,以逆序(递减)方式排 序。要保证-r 和-n 能够组合在一起使用。

doodlesomething 1029

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

读经典之TCPL练习三

把某月某日这种日期表示形式转换为某年中第几天 把某年中第几天表示形式转换为某月某日这种日期

doodlesomething 763

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

TCPL——练习1.9

  打算这段时间重新拜读TCPL这本经典著作,并把后面的习题都做一遍。结果,发现我的决定是多么的正确,多么有必要。   原因在于下午一道练习题,很简单:编写一个将输入复制到输出的程序,并将其中连续的多个空格用一个空格来表示。   很简单,本来前几章的练习都不打算写,因为之前国庆回家正好带回了一本《The C Answer Book》,就打算写写然后看看答案。不假思索我就写了一个程序: ...

weixin_30919235的博客 142

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

看了TCPL后,对C C++书籍的一些想法

看了TCPL后,对C C++书籍的一些想法

rgjtfc的博客 665

探秘Joyounger's TCPL:一个高效的TCP流量控制库

探秘Joyounger's TCPL:一个高效的TCP流量控制库 项目简介 是由Joyounger开发的一个高性能、低延迟的TCP流量控制库。该项目旨在提供更优秀的网络通信性能,尤其适合实时性要求高的应用环境,如游戏、音频/视频传输和金融交易等领域。 技术分析 优化的TCP算法:TCPL的核心是对标准TCP协议进行了优化,它采用了自适应的拥塞控制算法,能够在保持高吞吐量的同时降低网络延迟,显著...

gitblog_00062的博客 384

TCPL 的学习

         这两天一直在学习TCPL( the c programming language). 现在又开始学c,真的是感觉又回到了原点. 可是有什么办法呢?谁叫自己以前这么浮躁, 总是贪快,总是怀疑, 总想找一条最好的捷径, 最后呢? 一条好好的路, 没有走下去, 另一条路又没找到. 最后干脆就停止了. 等明白过来, 那样是学不来的,时间已经被浪费了好多好多.        今天学

邹创 1152

读《TCPL》II

1 导言 《TCPL》(纸质-中文)没有再出新的版本来与C99相匹配,最新的C标准为C11(优快云视C99和C11为同一文件,所以没有上传)。所以摘抄(根据个人情况)的文字都只是遵从C89的。 若有空闲时间,猜其中例子验证和习题将在读完HB后再安装个Linux来练习。练习不限于Cxx且比摘录重要得多。 (1) EOF EOF定义在头文件,是一个整型数。其具体数值是什么并不

记一忘三二 2532

TCPL读书笔记(1)

今天看了TCPL的第1章,对我来说习题的难度还是比较大,总结下经验 1.C中如果想输出\\ 应该为\\\\ 2.练习1.13想了能有一个小时才搞定………… #include&lt;stdio.h&gt; #define MAX 10//记录单词长度最大为9 #define IN 1 #define OUT 0 int main(void) { int c,i,j; in...

A.I.学习路漫漫 老婆将降大任于斯人也 161

TCPL——练习1.13

  坚持每天写一两道小练习:-)   TCPL练习1.13: 编写一个程序,打印输入中单词长度的水平和垂直直方图。很简单,就是垂直的时候,我用了二维数组,真是浪费空间啊。当然有局限性,只能规定单词长度在什么范围内。TCAB里面通过一条数学运算,没借助二维数组来实现,我没有验证,也没有看懂那运算是怎么得出结果的。 代码 #include <stdio.h>#include ...

weixin_30363817的博客 150

TCPL学习笔记

        近来在看Bjarne Stroustrup的TCPL(The C++ Programming Language)中文特别版。看到第6章6.2.5的“增量和减量”的一节,其中举的例子,让人非常深刻地领略到C++的优雅、简洁与高效(从这个例子来看是不是高效,有待验证),下面来看看书中的例子:          运算符 ++ 和 -- 对于在循环里增加或减少变量特别有用。例如,以0结尾的

flinki's zoril 1594

TCPL——练习3.3

  TCPL练习3-3的题目是这样的:函数expand(s1, s2),将字符串中s1中类似a-z的速记扩展为:abcd...xyz,并能处理大小写,并可以处理a-b-c-d, a-z0-9, -a-z这样的情况,前导的-字符照样排印。   我记得这道题在豆瓣上看朋友用PY写得很简洁,用C写的代码看起来比较累赘,可能也是我想得比较复杂。代码: 代码 #include <std...

weixin_30822451的博客 143

看了TCPL后,对C,C++书籍的一些想法

的确好久没有来写些什么新东西了,的确经常和同学们疯狂喝酒,彻夜狂欢似的K歌,没有那份清醒来完成什么新的东西,但是大整数基本有了个思路,而且最近回头去看了看TCPL,K&amp;D那本,感觉其实自己学C都有3年多了,虽然中间断断续续,个人感觉是同学们中间学的最好的,大一考试笔试只扣了2分,很早的就过了C二级,并且自己很喜欢用C解决一些实际的问题,比如物理实验的数据计算,本来N组数据的计算,同学们都辛...

webcenterol 240

读《TCPL》I

相关笔记:《C和指针》摘录笔记 看电子书是一件非常辛苦的事情。需要长时间的坐在电脑面前,在冬天里还需要牺牲一只手去移动鼠标或者电脑的下滑键(自动翻页只适合小说,看The  C  Programming  language 在某些地方还得停下来)。英文还不是很好and书还是英文的,很多不知道的地方估计都以脑海空白的形式略过了。书还是看纸质的比较好,没那么累,尤其对于一个做一件事情完全没有节

记一忘三二 3236
上一篇: assert 用法
下一篇: yum 安装指定的php版本
doodlesomething
博客等级 码龄13年 53粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值