- 浏览: 16828 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
sunwb2009:
你怎么骗哥呢?没jar么!
json-lib运行环境所需的jar包 -
sunwb2009:
非常不错,好!
json-lib运行环境所需的jar包
这次面试腾讯,面试官要我写个字符串拷贝函数,头一天晚上一晚上没睡好,脑袋昏昏沉沉的,之前看过C++中的字符串拷贝构造函数,先入为主,也没多想就开始了String类的拷贝构造函数,写完之后,将结果给面试官看,面试官说有几个问题,说怎么用这么长时间,然后我检查问题所在,第一个是字符串拷贝后,最后没有添加'\0',因为循环判断的条件是!='\0',所以很明显没有这个,将导致严重的安全问题,产生越界和内存非法访问问题。问题在于C语言中对字符串的读取是直到找到第一个'\0'才结束。虽然马上发现了,但是明显这是平时没有引起足够的重视引起的。第二个问题就是为什么要在里面重新开辟一块内存区来存储字符串,这个问题正是因为我把这个问题想成c++字符串拷贝构造函数,而C++的字符串实现中,字符串类大概定义如下:
class String
{
public:
String(const char *str = NULL); // 普通构造函数
String(const String &other); // 拷贝构造函数
~ String(void); // 析构函数
String & operate =(const String &other); // 赋值函数
private:
char *m_data; // 用于保存字符串
};
而实现字符串拷贝构造函数基本就是如下:
String::String(const String &other)
{
int len = strlen(other.m_data);
m_data = new char[len+1];
strcpy(m_data, other.m_data);
}
晕哦,现在回想起来,当时整个脑子估计处于昏迷状态。
其实,就是简单的一个字符串拷贝,如果放在平时的话,简单的不能再简单。
char *strcpy(char *strDest, const char *strSrc);
{
assert((strDest!=NULL) && (strSrc !=NULL));
char *address = strDest;
while( (*strDest++ = * strSrc++) != '\0' ) NULL ;
return address ;
}
这里有三个需要注意的地方,第一个就是断言宏assert的使用,说真的,以前真还没具体的弄懂断言啥子个意思,assert这个单词用中文来理解真TM费力,倒是可以通过英语的解释来理解:
同义词: affirm declare insist on pronounce state
to declare or affirm solemnly and formally as true; affirm, verify
assert to be true; insist
这样来看,assert宏就是要求里面的条件都是真的,在运行过程中,如果assert 的参数为假,那么程序就会中止(一般地还会出现提示对话,说明在什么地方引发了assert)。
第二个:while( (*strDest++ = * strSrc++) != '\0' ) NULL ; 这里++运算符优先级较*高,而且这个里面隐式包含了将'\0'赋值给字符串最后,因为采用的 指针后++,当strSrc为最后一个字符时,条件为真,后++后,strSrc指向'\0',先赋值,再比较,条件为假,退出循环,不好理解,自己也可以采用好理解的方式写。如下:
while(*strSrc!='\0')
{
*strDest = * strSrc;
strDest++;
strSrc++;
}
*strDest ='\0';
第三个问题:strcpy 能把strSrc 的内容复制到strDest,为什么还要char * 类型的返回值?这是为了实现链式表达式。 所谓链式表达式就是可以将strcpy函数作为其他函数的参数。
例如 int length = strlen( strcpy( strDest, "hello world") );
这次技术面试的第一个问题就弄成这样,虽然后面的问题答的可以,但是显然这样的开始给面试官不好的映象,如果给人家第一映象都不好,也就难怪面试官也会在心理上先入为主啦,其实还有我在hr面的时候,hr对我的穿着形式也提出了建议,这个可能会决定我的这次面试成功与否,总之细小的地方注定成败,这句话我现在是有深刻的体会啦。
发表评论
-
用Javascript正则表达式验证Email地址
2012-07-06 09:44 1057用Javascript正则表达式验证Email地址 收 ... -
[转]JavaScript-正则表达式(二)
2012-07-06 09:37 583JavaScript中的正则表达式简介 摘要:对文本数 ... -
时钟
2012-07-06 09:29 572extrn music:far,gensound:far ... -
两款JAVASCRIPT幻灯片
2012-07-05 20:44 742New Document ... -
Xtree组件笔记
2012-07-03 13:42 7371.XTREE简介: XTREE是一个基于AJAX实现 ... -
Xtree组件笔记
2012-07-03 12:16 6941.XTREE简介: XTREE是一个基于AJAX实现 ... -
HR人员基本信息、分配信息和地址信息SQL
2012-07-02 10:13 618人员信息、分配信息和地址信息SQL语句: SELECT p ... -
Firefox/Chrome下flash的wmode参数设为opaque或transparent时输入文本框中无法输入中文汉字的解决方法
2012-07-02 10:13 533这段时间做个项目 ... -
Android AIR 学习(一)
2012-07-02 10:13 669从Android 2.2开始flash ... -
学习Flex,都学些什么
2012-07-01 09:33 463学习Flex,都学些什么呢? 1、首先是事件机制,整 ... -
Flex屏蔽默认右键菜单。
2012-07-01 09:33 624首先需要修改index.template.html生成的静 ... -
An introduction to Spring BlazeDS integration
2012-07-01 09:33 522Over a year ago, SpringSource ... -
Flex DataGrid 控件知识汇总,创建、全选、删除、分页、样式
2012-07-01 09:33 655DataGrid控件是一个可以展示多列数据的列表控件。它是 ... -
Flex操作Json数据示例
2012-07-01 09:33 511Flex操作Json数据示例 本示例中需要用到JSO ... -
几个问题及解决方法
2012-06-30 17:51 919在编译VC 工程时出现的编译错误 问题如下 ... -
Zend Studio 安装后启动报错的解决方法
2012-06-30 17:51 753本文转自:http://www ... -
log4cpp 内存泄漏 解决方法
2012-06-30 17:51 1197以前一直自己写日志类的框架 最近了解了一下开源的,感 ... -
我的嵌入式学习笔记(2)--scanf使用常见问题及解决方法
2012-06-30 17:51 493作者:曹忠明,华清远见嵌入式学院讲师。 在学习C语言 ... -
java.lang.OutOfMemoryError: Java heap space解决方法
2012-06-30 17:51 489//首先检查程序有 ...
相关推荐
C实现内存拷贝以及字符串拷贝函数。。。。。。。。。
//字符串拷贝函数char * sCpy(char *strDest, char *strSource){ _ASSERT((strDest != NULL) && (strSource!=NULL)); char *d = strDest; //获取dest的当前位置 char *s = strSource; //获取source的当前位置 ...
该程序是我写的博客“一起talk C栗子吧(第六十回:C语言实例--字符串复制)”的配套程序,共享给大家使用
1、讲解通过指针变量实现字符串拷贝函数的代码编写方法; 2、探讨字符串数组和字符串常量在字符串复制过程中的各种情况;
。。。
。。。
。。。
。。。
c++常用到的字符串拷贝函数,实现了简单的功能
memcpy: 头文件,函数原型,函数功能,函数返回值,说明
以下是对字符串拷贝函数memcpy和strncpy以及snprintf它们之间的性能进行了比较,需要的朋友可以过来参考下
功 能: 拷贝一个字符串到另一个 用 法: char *strcpy(char *destin, char *source); 程序例: C/C++ code #include #include int main(void) { char string[10]; char *str1 = "abcdefghi"; stpcpy(string, str1...
实现strcpy,strcpy的功能的实现原理
1、讲解字符串拷贝函数strcpy的原理和代码实现方法;(面试题) 2、讲解字符串连接函数strcat的原理和代码实现方法;(面试题) 3、讲解字符串大小写转换函数strupper和strlower的原理和代码实现方法(面试题);
功 能: 拷贝一个字符串到另一个 用 法: char *stpcpy(char *destin, char *source); 程序例: #include <stdio.h> #include <string.h> int main(void) { char string[10]; char *str1 = ...
将字符串str1 拷贝到str2中
在C语言函数中调用汇编语言程序实现字符串的拷贝: 其中:源串:const char *srcstr=“abcdefghij” 目标串:char *dststr