c语言部分库函数,代码实现,以及细节理解

 代码来自:

 

http://blog.csdn.net/v_JULY_v

 

 

//得9 分
//为了实现链式操作,将目的地址返回,加2 分!
char * strcpy( char *strDest, const char *strSrc )
{
assert( (strDest != NULL) && (strSrc != NULL) );
char *address = strDest;
while( (*strDest++ = * strSrc++) != '/0' );
return address;
}

//得10 分,基本上所有的情况,都考虑到了
//如果有考虑到源目所指区域有重叠的情况,加1 分!
char * strcpy( char *strDest, const char *strSrc )
{
if(strDest == strSrc) { return strDest; }
assert( (strDest != NULL) && (strSrc != NULL) );
char *address = strDest;
while((*strDest++ = *strSrc++)!='/0');
return address;
}

 

 

strncpy 是 C语言的函数之一,来自 C语言标准库,定义于 string.h,char *strncpy(char *destin, char *source, int maxlen),把src所指由NULL结束的字符串的前n个字节复制到dest所指的数组中。
char *strncpy(char *strDes, const char *strSrc, unsigned int count)
{
assert(strDes != NULL && strSrc != NULL);
char *address = strDes;
while (count-- && *strSrc != '/0')
*strDes++ = *strSrc++;
*strDes = '/0';
return address;
}

 

 

 

strcpy和memcpy都是标准C库函数,它们有下面特点:

strcpy提供了字符串的复制。即strcpy只用于字符串复制,并且它不仅复制字符串内容外,还会复制字符串的结束符。

strcpy的函数原型是:char* strcpy(char* dest, const char* src);

 

memcpy只提供一般的内存复制,即memcpy对于需要复制的内容没有限制,因此用途更广。

memcpy的函数原型是:void *memcpy(void *dest,  const char* src,  size_t count);

 

  char *strcpy(char *dest, const char *src)
  {
     if((src == NULL) || (dest == NULL))
      {
          return NULL;
     }
 
     char *strdest = dest; // 保存目标字符串的首地址
     while((*dest++ = *str) != '\0');
     return strdest;
 }

 

 

void *memcpy(void *memTo, const char *memFrom, size_t size)
{
     if((memTo == NULL) || (memFrom == NULL))
     {
          return NULL;
     }

     char *tempFrom = (char *)memFrom; //保存memFrom的首地址
     char *tempTo = (char *)memTo; //保存memTo的首地址
      while(size-- > 0)
     {
          *tempTo++ = *tempFrom++;
     }
     return memTo;
}

 

strcpy 和 memcpy主要有以下三方面的区别:

1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符串、整型、结构体、类等。

2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符串的结束符"\0”才结束,所以容易溢出。memcpy则是根据第3个参数决定复制的长度。

3、用途不同。通常在复制字符串时用strcpy,而需要复制其它类型的数据是用memcpy。

 

memcpy 和 memmove 都是C语言中的库函数,在库函数 string.h中,其原型相似,它们都是从src所指向的内存中复制count个字节到dest所指内存中。并返回dest的值。

当源内存区域 和 目标内存区域无交叉重叠时,两者的结果是一样的,但如果有交叉呢?

memcpy是从src的其实部分开始复制,所以虽然第一种情况下没有问题,但如果遇到第二种情况,则会发生错误,交叉部分的src内容就会被覆盖掉了。

而memmove则由于采用不同的复制机制,所以可以正确处理第二种情况。

 

 

void *memmove(void *dst,const void *src,int n)
{
     char *dp = (char *)dst;
     char *sp = (char *)src; 
     assert((src!=0)&&(dst!=0)&&(n>0));//not null 
     //非重叠 
      //dp < sp 
     //dp > (sp+n)
     if(sp>dp||(sp+n)<dp)
     { 
         while(n--) 
             *(dp++) = *(sp++);
         *dp = '\0';
     }
     else if(sp<dp)//重叠 (此时条件 sp<dp<(sp+n))如果sp==dp则快速的返回
     {//反向拷贝  
          sp += n; 
         dp += n; 
         *dp = '\0'; 
         while(n--)
            *(--dp) = *(--sp); 
     }

     return dst;
}       

 

在很多库函数上看到使用了assert()函数,assert函数的作用是计算表达式expression ,如果其值为假(即为0),那么它先向stderr打印一条错误信息,然后调用abort()来终止进程。

函数名: abort

功 能: 异常终止一个进程

描述:abort()函数首先解除进程对SIGABRT信号的阻止,然后向调用进程发送该信号。abort()函数会导致进程的异常终止除非SIGABRT信号被捕捉并且信号处理句柄没有返回。

abort()函数导致所有的流被关闭和冲洗。

abort()函数没有返回值:void abort(void);

用 法: void abort(void);

程序例:

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
printf("Calling abort()\n");
abort();
return 0; /* This is never reached */
 }

 

时间: 2024-11-29 03:24:37

c语言部分库函数,代码实现,以及细节理解的相关文章

C语言字符串库函数的实现

 C语言字符串库函数的实现也是笔试题常考的题目,以下代码没有严格测试,只是简单的实现: //字符串长度 int strlen(const char *str) { assert(str != NULL); int len = 0; while (*str ++ != '\0') ++ len; return len; } //字符串拷贝 char *strcpy(char *to, const char *from) { assert((to != NULL) && (from != NU

c语言数据结构问题 代码相似性度量

问题描述 c语言数据结构问题 代码相似性度量 我的思路:对要进行比较的所有代码段进行词法分析,并转化为特定的标记(token)串,自己制定一个转换规则.接着,通过两两比较标记(token)串来确定代码之间的相似性,并由此确定代码之间抄袭的程度. 将这两个代码分别转换为token串后,基于算法RKR-GST( running-karp-rabin greedy-string-tiling)算法思想,循环求取两个标记串中未被匹配部分的最大公共子串,将其用空格代替,并根据公式求出两个token串A,B

求大神帮我解释一下liquid语言的jekyll代码

问题描述 求大神帮我解释一下liquid语言的jekyll代码 <div class="well"> <h4>Recent posts</h4> <ul class="posts" span="recent"> {% for post in site.posts limit:5 %} <li> <span>{{ post.date | date_to_string }}<

求解决-怎么用c语言编这个代码,求指教

问题描述 怎么用c语言编这个代码,求指教 /**给定四种水果,分别是苹果(apple).梨(pear).桔子(orange).葡萄(grape),单价分别对应为3.00元/公斤.2.50元/公斤.4.10元/公斤.10.20元/公斤. 首先在屏幕上显示以下菜单: [1] apple [2] pear [3] orange [4] grape [0] exit 用户可以输入编号1~4查询对应水果的单价.当连续查询次数超过5次时,程序应自动退出查询:不到5次而用户输入0即退出:输入其他编号,显示价格

【C 语言】 这个代码错在哪了?我用的是Dev C++

问题描述 [C 语言] 这个代码错在哪了?我用的是Dev C++ /*题目:输入某年某月某日,判断这一天是这一年的第几天?*/ #include #define MONTH 12 struct date{ int Day; int Month; int Year; }; int main() { int count,days,month; struct date today; int daysPerMonth[12]={31,28,31,30,31,30,31,31,30,31,30,31};

c语言-BP算法的C语言实现,代码个人测试正确, 但是wrong answer, 求大神指点

问题描述 BP算法的C语言实现,代码个人测试正确, 但是wrong answer, 求大神指点 #include #include #include #include #include //#include "user.h" #include #include #include #include #include #include #define _CRT_SECURE_NO_WARNINGS #define _USE_MATH_DEFINES using namespace std;

c语言-C语言的这个代码表达不了,大神帮忙看看。

问题描述 C语言的这个代码表达不了,大神帮忙看看. #include #define N 50 //学生人数 #define M 3 //课程门数 void Input(int score[][M+3], int n); { int i, j, sum; printf("Input Number and %d score:n",M); for (i = 0; i < n; i++) { sum = 0; printf("%d:",i+1); for (j =

c语言-求各位大师帮帮忙设计一个程序 C语言 写出代码

问题描述 求各位大师帮帮忙设计一个程序 C语言 写出代码 设计某班学生成绩管理系统,要求实现以下功能: 1.从键盘输入学号.姓名.各门课程成绩(不少于2门),并将其保存在文件中. 2.打开文件后,计算每个人的总分和平均分,排序并保存. 3.可以在文件中进行单项查询或多项查询的功能. 万谢 解决方案 人都这样,有了想法就不想写代码了,想叫别人写,所以才雇佣别人去做码农 解决方案二: 这种作业题在网上搜搜都会有的,比如这个http://blog.csdn.net/sdliujiangbo/artic

字符串-求大神帮忙看看这个c语言他题目代码的缺陷~~

问题描述 求大神帮忙看看这个c语言他题目代码的缺陷~~ 7.1连接两个字符串 不使用 strcat 函数,编写一个程序将两个字符串连接起来,注意程序首先需要通过键盘输入两个字符串,然后将它们连接起来,将连接后的字符串存储于新的字符数组中,再打印数出. #include<stdio.h> int main() { char a[50],b[50],c[50];int i=0,j; gets(a); gets(b); while(a[i]!='') { c[i]=a[i]; i++; } j=i,