c语言函数笔记博客 c语言函数基础知识
求c语言的详细教程
推荐:
创新互联主要从事网站设计、成都网站制作、网页设计、企业做网站、公司建网站等业务。立足成都服务榆树,10余年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:18980820575
1.C语言编程宝典
2.C In China
3.百度C语言吧
4.编程中国
5.C语言之家
6.C语言基地
c语言基地 有名校教师 视频 教学
我认为要学好C语言首先必须了解等级考试C语言的大纲和内容,以及各种辅助材料的用途,这是学好C的基础。从以前的经验以及考网上的一些信息可知,要自学C语言必须准备以下资料:
1、 教材:大家现在都公认是清华大学谭浩强主编的那本,当然有其他的也可以,如高校出版社的。
2、 习题集:我认为清华大学的《C语言样题汇编》不错。书后面附有答案。
3、 上机练习:我认为南开大学的那个可以,最好是在考前从头到尾做一遍。答案可以去考网下载区下载。
4、 大纲:这个肯定要的,可以在考网二级版那里去下,然后打印出来。
5、 自学计划:为了做到有计划有目的地学习C语言,大家可以根据自己的学习(或工作)情况,制定一个自学计划,循序渐进地学习。
6、 模拟盘:为了更好地熟悉考场环境,下一个模拟盘是必不可少的,可以在。下载,注意,在下载时要把锁匙盘一起下回来,否则不能进入考试环境。
7、 教学光盘:如果能买到C语言的教学光盘,那当然更好,这样可以更直观地学习C语言了。
下面从微观上针对C语言的几个重点和难点,逐个谈谈具体的自学方法。
二 如何学习C语言的运算符和运算顺序
C语言的运算功能十分丰富,运算种类远多于其它程序设计语言。因此,当多种不同运算组成一个运算表达式,即一个运算式中出现多种运算符时,运算的优先顺序和结合规则显得十分重要。
初学者往往对此感到非常困难,觉得C语言学习太繁杂,其实只要我们对此合理进行分类,找出它们与我们在数学中所学到运算之间的不同点之后,记住这些运算也就不困难了,有些运算符在理解后更会牢记心中,将来用起来得心应手,而有些可暂时放弃不记,等用到时再记不迟。
下面是所有的运算符按优先级不同分类列表:(对不起,因为表格显示不正常,已被我删除大家可以看书上的)
表中列出15种优先级的运算符,从高到低,优先级为1 ~ 15,最后边一栏是结合规则,除第2、3级和第14级为从右至左结合外,其它都是从左至右结合,它决定同级运算符的运算顺序。
下面我们通过几个例子来说明:
(1) 3*20/4%10 这个表达式中出现3种运算符,是同级运算符,运算顺序按从左至右结合,因此先计算3 * 20=60,然后被4除,结果为15,最后是%(求余数)运算,所以表达式的最终结果为15%10 = 5
(2)a = 3;b = 5;c =++ a* b ;d =a + +* b;
例子中的“;”是C语言的语句分隔符,执行顺序为从左到右,第1条语句执行后a的值为3,第2条语句执行后b的值为5,第3条语句中有两个运算符前置+ +和*,按表中所列顺序,+ +先执行,*后执行,所以+ + a执行后,a的值为4,由于+ +为前置运算,所以a的值4参与运算,C的值为20,最后执行第4条语句,由于a + +为后置运算,所以a值为4参与运算,使得d的值仍为20,而a参与运算后其值加1,值为5。
这个例子执行后,a的值为5,b的值为5,c的值为20,d的值也是20。
(3)a = 3,b = 5,b+ = a,c = b* 5
例子中的“,”是逗号结合运算,上式称为逗号表达式,自左向右结合,最后一个表达式的结果值就是逗号表达式的结果,所以上面的逗号表达式结果为40,a的值为3,b的值为8,c的值为40。
三、如何学习C语言的四种程序结构
(1)顺序结构
这种结构的程序比较简单,就是按照语句的排列顺序依次执行的机制。顺序结构的执行顺序是自上而下,依次执行,因此编写程序也必须遵守这一规定,否则你的程序执行结果就不对。
例如;a = 3,b = 5,现交换a,b的值,正确的程序为:
c = a;
a = b;
b = c;
执行结果是a = 5,b = c = 3如果改变其顺序,写成:
a = b;
c = a;
b = c;
则执行结果就变成a = b = c = 5,不能达到预期的目的,这是初学者常犯的错误。
顺序结构可以独立使用构成一个简单的完整程序,常见的输入、计算,输出三步曲的程序就是顺序结构,例如计算圆的面积,其程序的语句顺序就是输入圆的半径R,计算S = 3.14159*R*R,输出圆的面积S。而大多数情况下顺序结构都是作为程序的一部分,与其它结构一起构成一个复杂的程序,例如分支结构中的块体、循环结构中的循环体等。
C语言自学方法(2)
(2) 分支结构
分支结构与顺序结构不同,其执行是依据一定的条件选择执行路径,而不是严格按照语句出现的物理顺序。分支结构的程序设计方法的关键在于构造合适的分支条件和分析程序流程,根据不同的程序流程选择适当的分支语句。
分支结构适合于带有逻辑条件判断的计算,设计这类程序时往往都要先绘制其程序流程图,然后根据程序流程写出源程序,这样做把程序设计分析与语言分开,使得问题简单化,易于理解。程序流程图是根据解题分析所绘制的程序执行流程图。
学习分支结构不要被分支嵌套所迷惑,只要弄清基本的分支结构,嵌套结构也就不难了。嵌套只不过是分支块体中又包括分支语句而已,不是新知识,只要你基础知识扎实,分支嵌套也难不住你,下面我们重点讨论几种基本的分支结构的学习方法。
①If(条件)
{
块
}
这种分支结构中的块可以是一条语句,此时“{
}”可以省略,也可以是多条语句。它有两条分支路径可选,一条是条件为真,执行块,另一条是条件不满足,跳过块。
如,计算x的绝对值,根据绝对值定义,我们知道,当x=0时,其绝对值不变,而x0时其绝对值是为x的反号,因此程序段为:if(x0)
x=-x;
②if(条件)
else
这是典型的分支结构,如果条件成立,执行块1,否则执行块2,块1和块2都有1条或若干条语句构成。
如:求ax^2+bx+c=0的根
分析:因为当b^2-4ac=0时,方程有两个实根,否则(b^2-4ac0)有两个共轭复根。其程序段如下:
d=b*b-4*a*c;
if(d=0)
{x1=(-b+sqrt(d))/2a;
x1=(-b-sqrt(d))/2a;
printf(“x1=%8.4f,x2=%8.4f\n”,x1,x2);
}
else
{r=-b/(2*a);
i =sqrt(-d)/(2*a);
printf(“x1=%8.4f+%8.4fi\n”r, i);
printf(“x2=%8.4f-%8.4fi\n”r,i)
}
③多路分支:其语句格式为:
if(条件1) ;
else if(条件2)
else if(条件3)
……
else if(条件n)
else
④switch语句:
switch
语句也是多分支选择语句,又称为多路开关语句,到底执行哪一块,取决于开关设置,也就是表达式的值与常量表达式相匹配的那一路,它不同if—else 语句,它的所有分支都是并列的,程序执行时,由第一分支开始查找,如果相匹配,执行其后的块,接着执行第2分支,第3分支……的块,直到遇到break语句;如果不匹配,查找下一个分支是否匹配。
(3)循环结构:
循环结构可以减少源程序重复书写的工作量,用来描述重复执行某段算法的问题,这是程序设计中最能发挥计算机特长的程序结构,C语言中提供四种循环,即goto循环、while循环、do –while循环和for循环。
四种循环可以用来处理同一问题,一般情况下它们可以互相代替换,但一般不提昌用goto循环,所以下面我们重点讲解另外的三种循环。
常用的三种循环结构学习的重点在于弄清它们相同与不同之处,以便在不同场合下使用,大家好好看一下书中三种循环的格式和执行顺序,如何替换使用,如把while循环的例题,用for语句重新编写一个程序,这样能更好地理解它们的作用。
注意:在while和do—while循环体内和for
循环中的第3语句中,应包含趋于结束的语句(如I++,I--),否则就可能成了一个死循环,这也是初学者的一个常见错误。
下面我们来讨论下这三种循环的异同之处:
用while和do—while循环时,循环变量的初始化的操作应在循环体之前,而for循环是在语句1中进行的;while
循环和for循环都是先判断表达式,后执行循环体,而do—while循环是先执行循环体后判断表达式,也就是说do—while的循环体最少被执行一次,而while
循环和for就不一定了。这三种循环都可以用break语句跳出循环,用continue语句结束本次循环,而goto语句与if构成的循环,不能用break和
continue语句进行控制。
这三种结构并不是彼此孤立的,在循环中可能出现分支、顺序结构,分支中也可能出现循环、顺序结构而把循环、分支看成一个语句,它又是构成顺序结构的一个元素,因此这三种结构相互结合,就能实现各种算法,设计出解题程序,但若是很大的题目,这样编出的程序往往很长,重复结构多,并且可阅读性差,因此我们常将C程序设计成模块化结构。
(4)模块化程序结构
C语言的模块化程序结构用函数来实现,即将复杂的C程序分为若干模块,每个模块都编写成一个合法的C函数,然后用主函数调用函数及函数调用函数实现一大C程序:C程序=主函(main)+若干个函数。
在程序设计中,常将一些常用的功能模块写成函数,也可以将大程序段分割成若干函数,前者目的在于减少重复编写程序段的工作量,后者目的在于缩短模块长度,以便程序阅读方便。
一个源程序文件由一个或多个函数组成,它是一个编译单位,而一个C程序由一个或多个源程序文件组成。对较大的程序,往往分成多个文件,这样可以分别编写、分别编译,提高高调试效率,一个源程序文件可以被多个C程序公用。
C程序的的执行是从main()函数开始,调用其它函数后流程回到main函数,在main中结束整个函数运行,main函数的称是系统规定的,用户可以修改其内容即函数体,但不能修改其名称和参数,一个C程序必须有一个main函数,也只能有一个main函数。
所有函数都是平行的,即在定义函数时是互相独立的一个函数度不从属于另一个函数,即函数不能嵌套定义,但可以互相调用,但不能调用main函数。
函数分成两类,即标准函数和用户自定义函数,标准函数又称库函数,由系统提供,用户可直接调用,C语言提供了丰富的库函数,请考生在编写C程序时查阅教材后的函数说明,这可节省你的编程工作量;用户自定义函数由编程者自己编写.
回答者:阿拉蕾啊呀 - 试用期 一级 7-23 11:13
提问者对于答案的评价:
太好了,非常感谢!
评价已经被关闭 目前有 1 个人评价
好
100% (1) 不好
0% (0)
对最佳答案的评论
19798802 C语言新手群快加入吧!!!!!!1
评论者: 549045259 - 见习魔法师 二级
浮躁的人容易问:我到底该学什么;----别问,学就对了;浮躁的人容易说:我要中文版!我英文不行!----不行?学呀!浮躁的人分两种:只观望而不学的人;只学而不坚持的人;浮躁的人永远不是一个高手。
评论者: hnytgl - 试用期 一级
其他回答共 4 条
1.读代码!
2.改代码!
3.写代码!
回答者:liuding1213 - 见习魔法师 二级 7-18 21:10
找一本经典教材,例如谭浩强的《C语言陈序设计》。
找一本习题集,要有全部详细解释的那种,最好有实例的代码答案。
花一个月把课本看完,务求理解。不理解的地方也不要死抠,做上标记等以后再解决。然后开始做题,不要因为题目简单就放过,往往简单背后蕴藏大的发现。也可以快速看完书,然后复习,每复习完一章后把习题集上的题目好好做一遍。
做题时最好在计算机上把不明白的地方亲自实践一下,然后在笔记本上写下自己的感想和心得。考试前翻一翻笔记即可。
千里之行始于足下,行动吧!
(OC 初级笔记)OC 常用数学函数(C语言)
1.算数函数
1.1产生随机数
rand()
1.2取绝对值
fabs()
1.3取复数的绝对值
cabs(struct complex i)
1.4浮点数的绝对值
fabs()/fabsf()/fabsl()
1.5取余
fmod(double, double)
1.6向上取整
ceil()/ceilf()/ceill()
1.7向下取整
floor()/floorf()/floorl()
1.8求最大值
fmax()/fmaxf()/fmaxl()
1.9求最小值
fmin()/fminf()/fminl()
1.10四舍五入
round()/roundf()/roundl()
2.指数与对数
2.1求 n 的 m 次方的值
pow(n, m)/powf(n, m)/powl(n, m)
2.2求 e 的 x 次方
exp(x)/expf(x)/expl(x)
2.3以 e 为底的对数值
log()/logf()/logl()
2.4以10为底的对数
log10()/log10f()/log10l()
2.5开平方(根号)
sqrt()
3.三角函数
3.1正弦值
sin()/sinf()/sinl()
3.2余弦值
cons()/cosf()/cosl()
3.3正切值
tan()/tanf()/tanl()
3.4双曲线正弦值
sinh()/sinhf()/sinhl()
3.5双曲线余弦值
cosh()/coshf()/coshl()
3.4双曲线正切值
tanh()/tanhf()/tanhl()
4.反三角函数
4.1反正弦值
asin()/asinf()/asinl()
4.2反余弦值
acos()/acosf()/acosl()
4.3反正切值
atan()/atanf()/atanl()
4.4反双曲线正弦值
asinh()/asinhf()/asinhl()
4.5反双曲线余弦值
acosh()/acoshf()/acoshl()
4.6反双曲线正切值
atanh()/atanhf()/atanhl()
一个字符串没有字节怎么表示

Jimmy1224 
码龄11年
关注
字符串是一种重要的数据类型,但是C语言并没有显式的字符串数据类型,因为字符串以字符串常量的形式出现或者存储于字符数组中。字符串常量适用于那些程序不会对它们进行修改的字符串。所有其他字符串都必须存储于字符数组或动态分配的内存中。本文描述处理字符串和字符的库函数,以及一些相关的,具有类似能力的,既可以处理字符串也可以处理非字符串数据的函数。
1.1 字符串基础
字符串是一串零个或多个字符,并且以一个位模式全0的NUL字节('\0')结尾。NUL字节是字符串的终止符,但它本身并不是字符串的一部分,所以字符串长度并不包括NUL字节。
头文件string.h包含了字符串函数所需的圆形和声明。在程序中包含这个头文件确实是个好主意,因为有了它所包含的原型,编译器可以更好地为程序执行错误检查。
1.2字符串长度
字符串的长度是它所包含的字符个数,不包含NUL字节。我们很容易对字符进行计数来计算字符串的长度。需要说明的是,如果strlen函数的参数不是一个以NUL字节结尾的字符序列,它将继续进行查找,直到发现一个NUL字节为止,这样strlen函数的返回值将是不确定数!
库函数strlen的源码如下:
size_t strlen(char const * string)
{
int length;
for (length = 0; *string++ != '\0'; ;)
{
length += 1;
}
return length;
}
注意:
strlen返回一个类型为size_t的值,它是一个无符号整数类型。在表达式中使用无符号可能导致不可预料的结果。
例如:
if ( strlen(x) = strlen(y) )
{
...
}
if (strlen(x) - strlen(y) = 0)
{
...
}
上面两个表达式看似相等,但事实上它们是不想等的。第一条语句是我们所预想的那样工作,但第2条语句的结果永远为真。因为strlen的结果是无符号,所以strlen(x)-strlen(y)的结果也是个无符号数,而无符号数都是大于等于“0”的。在表达式中如果同时包含了无符号和有符号数同样会产生奇怪的结果。
1.3 不受限制的字符串函数
最常用的字符串函数都是“不受限制”的,就是说它们只是通过寻找字符串参数结尾的NUL字节来判断它们的长度。这些函数一般都指定一块内存用于存放结果字符串。在使用这些函数时,程序员必须保证结果字符串不会溢出这块内存。
1.3.1 复制字符串
用于复制字符串的函数是strcpy,它的原型如下:
char *strcpy( char *dst, char const *src);
这个函数把参数src字符串复制到dst参数。如果参数src和dst在内存中出现重叠,其结果是未定义的。由于dst参数将进行修改,所以它必须是个字符数组或者是一个指向动态分配内存的数组指针,不能使用字符串常量。
目标参数以前的内容将被覆盖丢失。即使新的字符串比dst原先的内存更短,由于新的字符串是以NUL字节结尾,所以老字符串最后剩余的几个字符也会被有效地删除。需要注意的是字符结束标志也将被复制。
例如:
char message[] = "message";
...
if (...)
{
strcpy( message, "Dif");
}
如果条件为真并且复制顺利执行,数组将包含下面的内容:

第一个NUL字节后面的几个字符再也无法被字符串函数访问,因此从任何角度实现看,它们都已经是丢失的了。
注意:
程序员必须保证目标字符数组的空间足以容纳需要复制的字符串。如果字符串比数组长,多余的字符仍被复制,它们将覆盖原先存储于数组后面的内存空间的值。strcpy无法解决这个问题,因为它无法判断目标字符数组的长度。
1.3.2 连接字符串
strcat函数可以实现一个字符串添加到另一个字符串的后面。函数原型如下:
char *strcat( char *dst, char const *src);
strcat函数要求dst参数原先已经包含一个字符串(可以是空字符串)。它找到这个字符串的末尾,并把src字符串的一份拷贝添加到这个位置。如果src和dst的位置发生重叠,其结果是未定义的。
下面是这个函数的常见用法:
strcpy( message, "hello");
strcpy( message, customer_name);
注意:程序员必须保证目标字符数组剩余的空间足以保存整个src源字符串。
1.3.3 字符串比较
库函数strcmp的原型如下:
int strcmp( char const *s1, char const *s2);
字符串比较的规则:
对两个字符串自左向右逐个字符比较(按ASCII码值大小比较),直到出现不同的字符或遇到‘\0’为止,如果全部相同则认为相等。
1. s1小于s2,函数返回负整数;
2. s1大于s2,函数返回正整数;
3. s1等于s2,函数返回0;
注意:比较两个字符串更好的方法是把返回值与零进行比较。
if ( 0 == strcmp(str1,str2))
{
...
}
注意:
由于strcmp并不修改它的任一个参数,所以不存在溢出字符数组的危险。strcmp函数的字符串参数也必须以一个NUL字节结尾。如果不是,strcmp就可能对参数后面的字节进行比较,这个比较结果无意义!
1.4 长度受限的字符串函数
标准库函数还包含了一些函数,这些函数接受一个显式的长度参数,用于限定进行复制或比较的字符数。这些函数提供了一种方便的机制,可以防止难以预料的长字符串从它们的目标数组溢出。
这些函数的原型如下所示,和不受限制版本一样,如果源参数和目标参数发生重叠,strncpy和strncat的结果都是未定义。
char *strncpy(char *dst, char const *src, size_t len );
char *strncat(char *dst, char const *src, size_t len );
char *strncmp(char const *s1, char const *s2, size_t len );
1.4.1 strncpy
和strcpy一样,strncpy把源字符串的字符复制到目标数组。但它总是向dsr写入len个字符。如果strlen(src)的值小于len,dst数组就用额外的NUL字节填充到len长度。如果strlen(src)的值大于或等于len,那么只有len个字符被复制到dst中。此时,它的结果将可能不会以NUL字节结尾。
例如:
char dst[10];
char src[] = "abcdefghijklmn";
strncpy(dst, src,5);
//dst字符数组不是以NUL结尾,len是23,是个随机数
int len = strlen(dst);
警告:
strncpy调用的结果可能不是一个字符串,因此字符串必须是以NUL字节结尾。如果在一个需要字符串的地方(例如:strlen函数参数)使用了没有以NUL字节结尾的字符序列,会发生什么情况呢?strlen函数不知道NUL字节是没有的,所以它将继续一个字符一个字符的查找,知道发现NUL字节为止。或者如果函数试图访问系统分配给这个程序以外的内存范围,程序就会崩溃。
这个问题只有当你使用strncpy函数创建字符串,然后或者对它们使用str开头的库函数,或者在printf中使用%s格式打印它们时才会发生。考虑如下代码:
char buffer[BSIZE];
...
strncpy(buffer,name,BSIZE);
buffer[BSIZE-1] = '\0';
如果strlen(name)小于BSIZE,之后的赋值语句不起作用。但是,name长度很长,这条赋值语句可以保证buffer中的字符串是以NUL字节结尾。以后对这个数组使用strlen等其它函数就会正常工作。
1.4.2 strncat
strncat也是一个长度受限的函数,但它和strncpy不同,strncat从src中最多复制len个字符到目标数组的后面。并且,strncat总是在结果字符串后面添加一个NUL字节。它不管目标参数除去原先存在的字符串之后留下的空间够不够。
1.4.3 strncmp
strncmp用于比较两个字符串,但它最多比较len个字节。如果两个字符串在第len个字符之前存在不等的字符,这个函数停止比较,返回结果。如果两个字符串的前len个字符相等,函数就返回零。
1.5 字符串查找基础
标准库中存在许多函数,它们用各种不同的方法查找字符串。
1.5.1 查找一个字符
在一个字符串中查找一个特定字符最容易的方法是使用strchr和strchr函数,它们的原型如下:
char *strchr( char const *str, int ch);
char *strrchr( char const *str, int ch);
它们的第二个参数是一个整型值。但是,它包含了一个字符值(ASCII)。strchr在字符串中str查找字符ch第1次出现的位置,找到后函数返回一个指向该位置的指针。如果该字符并不存在于字符串中,函数就返回一个NUL指针。
strrchr的功能与strchr基本一致,只是它所返回的是一个指向字符串中该字符最后一次出现的位置(r:最右边)。
例如:
char src[] = "abc12def12";
printf("the first = %s\n",strchr(src,49));//strchr(src,'1')
1.5.2 查找任何几个字符
strprk是个更为常见的函数,它是查找任何一组字符第一次在字符串中出现的位置,它的原型如下:
char *strpbrk( char const *str, char const *group);
这个函数返回一个指向str中第1个匹配group中任何一个字符的字符位置。如果未找到函数返回一个NULL指针。
例如:
char src[] = "123qaz!@#";
char group[] = "aq!";
printf("location = %s\n",strpbrk(src,group));//qaz!@#,group中的字符第1次出现的位置是q
1.5.3 查找一个子串
为了在字符串中查找一个子串,我们可以使用strstr函数,它的原型如下:
char *strstr( char const *s1, char const *s2 );
这个函数在s1中查找整个s2第1次出现的位置,并返回一个指向该位置的指针。如果s2没有完整的出现在s1中任何地方,函数返回NULL指针。如果s2是一个空字符串,函数就返回s2。
1.6 高级字符串查找
1.6.1 查找一个字符串前缀
strspn和strcspn函数用于在字符串的起始位置对字符计数。它们的函数原型如下:
size_t strspn( char const *str, char const *group );
size_t strcspn( char const *str, char const *group );
1.6.2 查找标记
一个字符串常常包含几个单独的部分,它们彼此分隔开来。每次为了处理这些部分,你首先必须把它们从字符串中抽取出来。这个任务正是strtok函数所实现的功能。它从字符串中隔离各个单独的称为标记(token)的部分,并丢弃分割符。它的原型如下:
char *strtok( char *str, char const *sep);
sep参数是个字符串,定义了用作分隔符的字符集。str指定一个字符串,它包含零个或多个有sep字符串中一个或多个分隔符分隔的标记。strtok找到str的下一个标记,并将其用NUL结尾,然后返回一个指向这个标记的指针。
高级字符串查找将另外详解描述!
1.7 字符操作
标准库包含了两组函数,用于操作单独的字符,它们的原型位于头文件ctype.h。第一组函数用于字符分类,第二组函数用于转换字符。
1.7.1 字符分类
每个分类函数接受一个包含字符值的整型参数。函数测试这个字符并返回一个整型值,表示真或假。
int isalnum( int ch );
int iscntrl( int ch );
int islower( int ch );
int isprint( int ch );
int isupper( int ch );
int isspace( int ch );
1.7.2 字符转换
转换函数把大写字母转换为小写字母或把小写字母转换为大写字母。它们的函数原型如下:
int tolower( int ch );
int toupper( int ch );
toupper函数返回其参数的对应大写形式,tolower函数返回其参数的对应的小写形式。如果函数参数并不是处于一个适当的大小写的字符,函数将不修改直接返回。
提示:
直接测试或操纵字符将会降低程序的可移植性。例如,考虑下面这条语句,它试图测试ch是否是一个大写字符。
if( ch = 'A' ch = 'z' )
这条语句在使用ASCII字符集的机器上能够运行,但是在使用EBCDIC字符集的机器上将会失败。另一方面,下面这条语句
if ( isupper( ch ) )
无论机器使用哪个字符集,它都能顺利进行,因此字符分类和转换函数可以提高函数的可移植性。
1.8 内存操作
在非字符串数据中包含零值的情况并不罕见,此时无法使用字符串处理函数来处理这种类型的数据,因为当它们遇到第1个NUL字节时就停止工作。我们应该使用另外一组相关的函数,它们的操作与字符串函数类似,但这些函数能够处理任意的字符序列。下面是它们的原型:
void *memcpy( void *dst, void const *src, size_t length );
void *memmvoe( void *dst, void const *src, size_t length );
void *memcmp( void const *a, void const *b, size_t length);
void *memchr( void const *a, int ch, size_t length);
void *memset( void *a, int ch, size_t length);
每个原型都包含一个显示的参数说明需要处理的字节数,它们在遇到NUL字节时并不会停止工作。
1.8.1 memcpy
void *memcpy( void *dst, void const *src, size_t length );
memcpy从src的起始位置复制length个字节到dst的内存起始位置,我们可以使用这种方法复制任何类型的值。第3个参数length指定了复制值的长度(以字节计)。如果src和dst以任何形式出现重叠,其结果都是未定义的。
例如:
char temp[SIZE],value[SIZE];
...
memcpy( temp, value, SIZE);//从数组value复制SIZE个字节到temp
如果两个数组为整型数组该怎么办?下面语句完成可以完成这项任务:
memcpy( temp, value, sizeof(value) );
memcpy()前两个参数类型是void*型指针,而任何类型的指针都可以转化为void*型指针。
1.8.2 memmove
void *memmvoe( void *dst, void const *src, size_t length );
memmove函数的行为和memcpy差不多,只是它的源和目标操作数可以重叠。它的内部实现过程:把源操作数复制到一个临时位置,这个临时的位置不会与源或目标操作数重叠,然后再把它从这个临时位置复制到目标操作数。如果源和目标参数真的可能存在重叠,就应该使用memmove,如下所示:
//Shift the values int the x array left one position.
memmove( x, x+1, ( count-1 ) * sizeof(x[0]) );
1.8.3 memcmp
void *memcmp( void const *a, void const *b, size_t length);
memcmp对两段内存的内容进行比较,这两段内存分别起始于a和b,共比较length个字节。这些值按照无符号字符逐字进行比较,函数的返回值与strcmp函数一样。由于这些值是根据一串无符号字节进行比较的,所以memcmp函数用于比较不是单字节的数据如整数或浮点数时可能出现不可预料的结果。
1.8.4 memchr
void *memchr( void const *a, int ch, size_t length);
memchr从a的起始位置开始查找字符ch第一次出现的位置,并返回一个指向该位置的指针,它共查找length个字节。如果在length个字节中未找到该字符,函数就返回NULL指针。
1.8.5 memset
void *memset( void *a, int ch, size_t length);
memset函数把从a开始的length字节都设置为字符值ch。例如:
memset( buffer, 0, SIZE);//把buffer前SIZE个字节都初始化为‘\0’
文章知识点与官方知识档案匹配
C技能树字符串字符串输入与输出
106612 人正在系统学习中
打开CSDN,阅读体验更佳
字符串、字符和字节
三者关系: 字符串是由一个个字符组成的,每个字符又由一个或多个字节来表示,每个字节又由8个bit位来表示。 字符:计算机中使用的文字和符号,比如1、2、A、B、%等等。 字节(Byte):一种计量单位,表示数据量多少,它是计算机信息技术用于计量存储容量的一种计量单位。 不同编码里,字符和字节的对应关系不同: ①ASCII码中,一个英文字母占一个字节的空间,一个中文汉字占两个字节的空间。 ②UTF-8编码中,一个英文字符等于一个字节,一个中文等于三个字节。 ③Unicode编码中,一个英文等于两个字节,一个中
继续访问
字符与字符串(新手,c语言)
字符与字符串,新手详细笔记,c语言
继续访问

最新发布 字符串(字节)长度计算
一般英文占一个长度,汉字占两个长度(字节),获取中英混合的字符串长度。
继续访问
热门推荐 字节,字符及占用内存大小情况
(一)“字节”的定义 字节(Byte)是一种计量单位,表示数据量多少,它是计算机信息技术用于计量存储容量的一种计量单位。 (二)“字符”的定义 字符是指计算机中使用的文字和符号,比如1、2、3、A、B、C、~!·#¥%……—*()——+、等等。 (三)“字节”与“字符” 它们完全不是一个位面的概念,所以两者之间没有“区别”这个说法。不同编码里,字符和字节的对应关系不同:
继续访问
c语言字符串长度,占用字节大小,存放位置等问题
参考文章: 1、三者长度strlen问题 int main () { char *str="xiaolong"; printf("%d\n",strlen(str)); return 0; } 结果: #include stdio.h #include string.h int main ...
继续访问
Linux 中与字符串相关的函数strpbrk、strcasecmp、strspn(不间断更新)
本篇博客旨在整理出所有Linux网络编程中常用的字符串相关的函数,这些函数普遍用在处理网络通信中的字符串数据。话不多说,直接进入正题。 1、strpbrk函数 #includestring.h char* strpbrk(char* s1, char* s2); strpbrk()从第一个字符指针指向的位置 向后检查每个字符,直到遇到\0(不检查\0),如果检查到的某个字符在s2指向的字符串中,那么返回他的地址,并停止检查。 如果s1 、s2没有相同字符,返回NULL。 注:传入strpb
继续访问
Linux下对字符串处理的实现函数(一)
1.Linux下字符串大小写转换 2.Linux下删除字符串中对应标志字符串的首字符串 3.Linux下删除字符串中不需要的空格(示例:逗号前后) 5.Linux下处理字符串——忽略双引号内容 6.Linux下字符串分割——忽略双引号内容.........
继续访问

linux 纯字符串,Linux下常用的字符串函数
13. strlen()(返回字符串长度)相关函数表头文件 #include定义函数 size_t strlen (const char *s);函数说明 strlen()用来计算指定的字符串s的长度,不包括结束字符"\0"。返回值 返回字符串s的字符数。范例#includemain(){char *str = "12345678";printf("str length = %d\n"...
继续访问
linux 字符串操作函数
1 strchr 函数原型:extern char *strchr(char *str,char character) 参数说明:str为一个字符串的指针,character为一个待查找字符。 所在库名:#include string.h 函数功能:从字符串str中寻找字符character第一次出现的位置。 返回说明:返回指向第一次出现字符cha...
继续访问
linux下字符串操作,Linux shell 字符串操作详解-Fun言
1、Linux shell 截取字符变量的前8位实现方法有如下几种:expr substr “$a” 1 8echo $a|awk ‘{print substr(,1,8)}’echo $a|cut -c1-8echo $expr $a : ‘\(.\\).*’echo $a|dd bs=1 count=8 2/dev/null2、按指定的字符串截取(1)第一种方法:从左向右截取最后一个s...
继续访问
Linux操作字符串
目录 获取字符串长度: 提取子字符串: 子字符串消除 字符串替换 子字符串所在位置 获取字符串长度: 从字符串开始的地方匹配子字符串的长度: 1.expr match "$string" '$substring' 2.expr "$string" : '$substring 注释:$substring是一个正则表达式 提取子字符串: 1.${string:position} 在string 中从位置$position 开始提取子字符串. 如果$string为"*"或"@",
继续访问
Linux字符串操作
Linux字符串操作 描述 shell内置一系列的操作符合,可以对字符串进行操作; 常用操作 表达式 含义 ${#string} $string的长度 ${string:position} 在string中从位置position开始提取子串 ${string:position:length} 在string中从位置position开始提取长度为$length的子串 ${string#substring} 从变量string的开头删除最短匹配substring的子串 ${s
继续访问
linux 字符串比较、数值比较
字符串相等: [[ $str1 == $str2 ]] 字符串不相等: [[ $str1 != $str2 ]] 字符串大小比较: [[ $str1 $str2 ]] 字符串等于空: [[ -z $str2 ]] 字符串不等于空: [[ -n $str2 ]] 二元比较操作符,比较变量或者比较数字.注意数字与字符串的区别. 整数比较 -eq 等于,如:if [ "$a" -eq "$b" ] -ne
继续访问
Linux下常用的字符串函数合集分享
转自:Linux下常用的字符串函数一、字符间的转换1 tolower(将大写字母转换成小写字母)相关函数isalpha,toupper表头文件 include定义函数int tolower(int c);函数说明。。。 ...
继续访问
字符串(Linux应用编程篇)
关于字符串的相关操作有 输入、输出、合并、修改、比较、转换、复制、搜索等等 一、字符串I/O 宏定义文件指针:标准输入设备stdin、标准输出设备stdout、标准错误设备stderr 字符串输出 putchar()、puts()、fputc()、fputs()这些函数也是标准 I/O 函数,标准C库函数,且应层的函数是有缓冲的,性能和效率要比系统调用要高。 /* @ puts函数 @ 头文件:#include stdio.h @ s:需要进行输出的字符串 @ 返回值:成功返回一
继续访问
Linux下的基本C编程的三类高频函数操作第二类——字符串操作函数(str)
一,strlen和sizeof strlen一般用来求字符串长度,而sizeof是求这一段储存空间的大小。它们的区别在于strlen不计算空白符的大小,且遇到\0就会停止工作。 例如 #include stdio.h #include string.h int main(int argc, char **argv) { printf("%ld\n",strlen("hello baby"));//结果为10; printf("%ld
继续访问

linux shell 函数返回字符串,如何从Bash函数返回字符串值
您可以让函数将变量作为第一个arg,然后使用要返回的字符串修改变量。#!/bin/bashset -xfunction pass_back_a_string() {eval "$1='foo bar rab oof'"}return_var=''pass_back_a_string return_varecho $return_var打印“ foo bar rab oof”。编辑:在适当的位置添加...
继续访问
字符串长度与字节个数
在纯ASCII码下,字节数=字符串长度=字符个数,因为每个字符就一个字节。 在Unicode下,字节数/2=字符串长度=字符个数,因为每个字符都是2个字节。 在ASCII码与其它双字节字符系统混用时,字节数=ASCII码字符个数+双字节字符个数*2,而此时字符串长度到底怎么统计就不好说了,有的语言如C语言,此时字符串长度=字节数,有的语言如JS,此时字符产长度=字符个数。
继续访问
Linux 常用C函数(内存及字符串操作篇2)
Linux 常用C函数(内存及字符串操作篇2)2007-03-22 11:36 strcat(连接两字符串)
继续访问
c
c++
字符串处理
写评论

评论

1
本文名称:c语言函数笔记博客 c语言函数基础知识
链接地址:http://ybzwz.com/article/ddcsgeh.html