1、void test(void) char str = (char ) malloc(100) strcpy(str, ); if(str != null) strcpy(str “world”);/野指针 printf(str) 请问运行test函数会有什么样的结果?篡改动态内存区的内容,后果难以预料,非常危险。因为free(str) 之后,str成为野指针,if(str != null)语句不起作用。如果数组做函数形参,那么就蜕变为普通指针(不是指针常量),而且失去了常量性,可以被修改void test(char str100) str+;试题7:编写类String的构造函数、析构函数和赋值
2、函数class String public: String(const char *str = NULL); String(const String &other); String(); String & operator= (const String & private: char *m_data;String:String(const char *str) if(str = NULL) m_data = new char1;/arrary new else m_data = new charstrlen(str) + 1; strcpy(m_data, str);String(const
3、String &other) m_data = new charstrlen(other.m_data) + 1; strcpy(m_data, other.m_data);String() delete m_data;/array deleteString & String:operator= (const String & if(this = &other) return (*this);试题8:请说出C+中static和const关键字尽可能多的作用static的作用:1)static局部变量,作用域为本函数内,但是生存期是整个程序运行期,不同于auto变量,只初始化一次,下次调用时维持
4、上次的值。2)static全局变量,作用域为本文件内,生存周期是整个程序运行期3)static全局函数,作用域为本文件内4)类的static成员变量,该变量属于类,而不属于具体的对象,所有对象共有一份copy5)类的static成员函数,该函数属于类,而不属于具体的对象,所有对象共有一份copy,技术层面就是该函数不接受this指针const的作用:1)const变量,欲阻止一个变量被改变,用const关键字。必须定义时初始化,以后就没机会了2)指针常量和常量指针,const char *p,char* const p, const char * const p3)const形参,说明函数体不
5、应该改变该形参的值4)const成员函数,说明该函数不能够修改该类的成员变量,技术层面其this指针为const C *this5)返回值为const,使得返回值不能作左值,举例const classA operator *(const classA &a1, const classA &a2)如果返回值不是const的,那么下面的代码也正确,而这样的操作在C+的内置类型上是不行的,classA a, b, c;(a*b) = c ;字符串匹配及KMP算法-自己总结,比书上更容易懂收藏问题:主串s(长度n),模式串s(长度m),从主串s中找到第一个s的位置1.原始算法思路:两个指针(并不是真正
6、的指针,方便描述而已)i和j,i指向s的元素,j指向s的元素; 如果si=pj,那么i+,j+,往下走; 如果si !=pj,i回退到本次串匹配(即i-j)的下一个位置(即i-j+1),j回退到0#includestring.hint index(const char *s, const char *p) int n = strlen(s); int m = strlen(p); int i = 0, j = 0; while( in & j m) if(si = pj) i+;j+; i = i - j + 1; j = 0; if( j = m) return (i - j);elsere
7、turn -1;void main() char *s = abcdabcdef;char *p = abcdeprintf(%dn,index(s,p);/打印结果42.KMP算法2.1KMP的原理上面算法的时间复杂度O(n*m)。大师们在大概三十年前提出了一个O(n+m)的算法,KMP算法。KMP算法主要是解决si!=pj的时候,i回退的问题,就是:当si != pj时,i不回退,j回退到合适位置k,那么k如何确定?我画了个包含i, j, k关系的图,很清晰,一看就明白了,不像书上的罗列几个式子,根本不知缘由。如图所示,某次匹配中,要判断si !=sj之前,必然存在的条件:1)si-j+1
8、.si-1 = p1.pj-1如果假设j回退到合适位置k,那么k得满足:2)si-k+1.si-1=pj-k+1.pj-1= p1.pk-1由此引入:2.2KMP的nextj在C语言中定义2.3KMP算法实现把上面的原始算法稍微改动就得到KMP算法:int kmp_index(const char *s, const char *p, int *index) int n = strlen(s);int m = strlen(p);int i = 0, j = 0;while( iif(j= -1) | (si = pj) /注意j=-1,说明p0和当前的pj不相等,i+;else j = ne
9、xtj;if( j = m)return (i - j);计算nextj,这个从人的直觉上很容易求出来:j-1之前,p的前k个字符和后k个字符相同的最大k值。怎么用计算机来写程序呢?求nextj自身也是一个串匹配的问题,可以用我们在1.原始算法的方法来求(此处略),也可以模仿上面的kmp_index来写,首先看个例子:j 0 1 2 3 4 5 6 7a b c cnextj -1 0 0 next0: -1;next1:next0是-1,所以next1=0(-1+);next2:next1是0,p1!=p0,继续,next0是-1,所以next2=0(-1+);next3:next2是0,p
10、2=p0,所以next3是1(0+);.求next5:next4是1,因为p4=p1,所以next5=2(1+);求next6:next5是2,因为p5!=p2,继续,next2是0,因为p5!=p0,继续,next0是-1,所以next6=0(-1+);求next7:next6是0,因为p6=p0,所以next6=1(0+);OulipoTime Limit:1000MSMemory Limit:65536KTotal Submissions:7395Accepted:2879DescriptionThe French author Georges Perec (19361982) once wrote a book, La disparition, without the lettere. He was a member of the Oulipo group. A quote from the book:Tout avait Pair normal, mais tout saffirmait faux. Tout avait Fair normal, dabord, puis surgissait linhumain, laffolant. Il aurait voulu savoir o sarticulait lasso
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1