自我检测题2

来源:互联网 发布:为知笔记 archlinux 编辑:程序博客网 时间:2024/05/06 22:19

1.模拟实现memmove(百度面试的一道题)

FROM MSDN && 百科】

原型:  void *memmove( void* dest, const void* src, size_tcount );

#include<string.h>

由src所指内存区域复制count个字节到dest所指内存区域。

src和dest所指内存区域可以重叠,但复制后dest内容会被更改。函数返回指向dest的指针。

Copies the values of num bytes from the location pointed by source to the memory block pointed by destination. Copying takes place as if an intermediate buffer were used, allowing the destination and source to overlap.

memmove的实现:

#include<stdio.h>#include<string.h>#include<assert.h>char* my_memmove(char* dest,const char* src,int n){char *ret=dest;assert(dest);    assert(src);if((dest<=src)||(dest>=src+n)){        while(n--){*dest++=*src++;}}else{dest=dest+n;src=src+n;while(n--){*dest++=*src++;}}return ret;}int main(){ char arr[]="abcdefxxxx"; char* str=my_memmove(arr,arr+5,4); printf("%s",str); return 0;}

结果:



2.字符串替换空格:请实现一个函数,把字符串数组中的每个空格替换成“%20”;

程序:例如输入“we are happy.”,则输出的是"we%20are%20happy."

(这是剑指office的一道题)

程序实现:

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<string.h>void replace(char*str)           //用一个指针接受数组名,方便函数内部访问;{char* p=str;            //用指针变量p存储str,方便下面统计空格int len=strlen(str);    //计算字符串长度int old_end=len;        //原字符串的最后字符的下标int new_end=0;        //创建一个变量记录新的字符串的最后字符的下标int count=0;        //统计空格的变量while(*p)        //统计空格{if(*p==' '){count++;}p++;}new_end=len+count*2;          //每个空格乘以二是新的字符串的末字符的下标while(old_end<new_end)        //当原字符串的下标小于新字符串的下标{if(str[old_end]!=' ')  //当原字符串下标对应的字符不是空格{str[new_end--]=str[old_end--];//从后向前依次给新字符串赋值;}else         //如果原字符串遇到空格{ str[new_end--]='0'; //此时新字符串依次向后移动三位,倒序分别赋值0 2 %str[new_end--]='2';str[new_end--]='%';old_end--;   //此时原字符串也要向后移动一个单位,跳过空格}}}int main(){char arr[30]="we are happy.";replace(arr);printf("%s",arr);return 0;}

3.解释关键字static和volatile

static:

a.修饰变量:它们都存在内存的静态区;

a.1修饰局部变量:为静态局部变量,在函数体的内部进行,只能在这个函数里面用,同一个文档中的其他函数用不了,由于static修饰的变量总是储存在内存的静态 区,所以即使这个函数运行结束,这个静态变量的值也不会销毁,函数下次使用时仍然能用这个值;

a.2修饰全局变量:为静态全局变量,作用于仅限于被定义的文件中,其他文件即使使用extern声明也没法使用它,准确的说,作用域是从定义之处开始,到文件结尾结束,在定义之前的那些代码也不能使用;

B.修饰函数:函数前面加static似的函数成为静态函数,但此处的static的含义不是指存储方式,而是指对函数的作用域仅限于本文件(又称内部函数),使用内部函数的

好处是:不同的人编写不同的函数时,不用担心自己定义的函数是否会与其他未见的函数同名;


volatile:

volatile是易变的,不稳定的意思,volatile是关键字,是一种类型修饰符,用它修饰的变量表示可以被某些编译器未知的因素更改,比如操作系统、硬件或者其他线程等,遇到这个关键字声明的变量,编译器对访问该变量的代码不在进行优化,从而可以提供对特殊地址的稳定访问。
volatile 关键字告诉编译器该变量是随时可能发生变化的,每次使用它的时候必须从内存中取出他的值,因而编译器生成的汇编代码会从原内存地址中读取数据使用。
如果一个寄存器或者变量表示一个端口或者多个线程的共享数据,就容易出错,所以volatile可以保证对特殊地址的稳定访问


简单的说,你所定义的这个变量,在你程序运行过程中一直会变,你希望这个值被正确的处理,你就得每次从内存中去读这个值,这样就不会有错误了,这个volatile就是这个作用了。


0 1