# 由一道面试题引发的思考

由一道面试题引发的思考

created by jsjwql

"   you welcome,  GTSC  Microsoft         "

->"         Microsoft  GTSC,  welcome you   "

inline bool isLetter(char* p)

{

if (!*p)

return false;

if ((*p >= 'a' && *p <= 'z') || (*p >= 'A' && *p <= 'Z') )

return true;

else

return false;

}

//divide a string into words and space-punctuation sectors

char* GetWord(char** p)       //problem 1

{

char* tempStr = new char[20];   //problem 2

//char* tempStr = (char *)malloc(sizeof(char) * 20);

char* q= tempStr;

//handle the word and put it into tempStr

while ((**p != '/0')&&isLetter(*p))

{

*q = **p;

q++;

(*p)++;

}

//check if it is a world

if (isLetter(tempStr))

{

*q = '/0'; //add an end for using strlen() later //problem 3

return tempStr;

}

//if it is space-punctuation sector

while ((**p != '/0')&&!isLetter(*p))

{

*q = **p;

q++;

(*p)++;

}

*q = '/0';

return tempStr;

}

char* StringReverse(char* str)

{

if (!str)

return NULL;

char *p = str;

int size = strlen(str) + 1; //contains '/0'  //problem 3

char *container = new char[size];        //problem 2

//char *container = (char *)(malloc(sizeof(char) * size));

char *tail = container + size -1;

*tail = '/0'; //add an end

//tail--;                            //problem 4

while (*p != '/0')

{

//get a sector

char *q = GetWord(&p);

if (!q)

break;

int len = strlen(q);

tail -= len;

char *r = tail;

char *t = q;

//put it into container by the tail

for (int i = 0; i < len; i ++)

{

*r = *t;

r++;

t++;

}

delete q;               //problem 2

//free(q);

}

return container;

}

int _tmain(int argc, _TCHAR* argv[])

{

char* originalStr = "   you welcome,  GTSC  Microsoft         ";

char* reverseStr = StringReverse(originalStr);

if (reverseStr)

delete reverseStr;   //problem 2

//free(reverseStr);

return 0;

}

1.   提供一个化词的方法，把单词和非单词区(空格和标点看成一个整体)分开来

2.   申请一片空间，把这些划分出来的对象从改空间的尾部安插下去。

char* GetWord(char** p)  不能被定义成char* GetWord(char*p)

"you welcome,  GTSC  Microsoft         "前面的空格都没有了，但是如果定义成char* GetWord(char*p) ，则p仍然是"   you welcome,  GTSC  Microsoft         "，问题原因就像我们要在函数里面分配内存时一样，传入指针的指针。

int *p = new int[10];

int *head = p; //record the address of this array

for (int i = 0; i<5; i++)

{

*p = i;

p++;

}

int* test()

{

int *p = new int[10];

int *head = p; //record the address of this array

for (int i = 0; i<5; i++)

{

*p = i;

p++;

}

}

client端：

int* array = test();

strlensizeof的区别，借用上面的例子

char *p = new char[10];

char *head = p; //record the address of this array

for (int i = 0; i<5; i++)

{

*p = ‘a’;

p++;

}

*p = ‘/0’;

int len = strlen(head);

int size = sizeof(head);

 a a a a a /0

Strlen表示字符串的长度，不包括/0字符，因为它不属于字符串的一部分，只是起了表示字符结束了的作用。但是你要安排空间来存放这个字符/0。所以一个有5个字符的字符串至少要6个字节的空间来存放。如果没有/0的话，strlen就从首地址一直往后找知道找到有/0存在才结束。所以这样的话strlen的长度就无法预期了。

char p[10];

char *q = p;

for (int i = 0; i<5; i++)

{

*q= 'a';

q++;

}

*q = '/0';

int len = strlen(p);

int size = sizeof(p);

size10，有一点容易混淆的是以为size6就是字符串的长度加上字符/0。这只是针对数组的空间刚好容纳字符串和/0的时候。

p+10-1 而不是p+10. 相反如果末尾元素的地址是p，首地址就是p-10+1了。

• 本文已收录于以下专栏：

## 一道面试题引发的思考

• fancong5201314
• 2014年02月23日 19:35
• 1039

## 由一道面试题引发的setTimeout的用法思考

settimeout和箭头函数
• baidu_35407267
• 2017年06月11日 16:14
• 224

## 由阿里一道笔试题引发的思考

• hitprince
• 2011年09月20日 18:36
• 1826

## 由一道腾讯面试题引发对于关联数组的思考

• jiezou007
• 2012年09月14日 19:37
• 494

## 一道试题引发的血案

• sanwu2010
• 2014年06月18日 18:42
• 330

## 史上最难的一道Java面试题

• weixin_38553453
• 2017年06月08日 15:31
• 623

## (续)一道面试题引发的思考

• jianguole
• 2016年01月08日 08:52
• 86

## 一道360面试题引发的思考

• wuwenyu2012
• 2013年12月17日 16:55
• 521

## 一道 JS 面试题引发的思考

• bb_it007
• 2016年12月07日 14:15
• 174

## 一道js面试题引发的思考

• shut1k
• 2015年11月15日 13:46
• 341

举报原因： 您举报文章：由一道面试题引发的思考 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)