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

855人阅读 评论(0)

由一道面试题引发的思考

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];

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

{

*p = i;

p++;

}

int* test()

{

int *p = new int[10];

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

{

*p = i;

p++;

}

}

client端：

int* array = test();

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

char *p = new char[10];

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

{

*p = ‘a’;

p++;

}

*p = ‘/0’;

 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了。

0
0

* 以上用户言论只代表其个人观点，不代表CSDN网站的观点或立场
个人资料
• 访问：95114次
• 积分：1326
• 等级：
• 排名：千里之外
• 原创：28篇
• 转载：28篇
• 译文：0篇
• 评论：21条
评论排行
最新评论