游戏开发论坛

 找回密码
 立即注册
搜索
楼主: bloodshadow

游戏公司笔试题 回来的路上发觉做错了 ??

[复制链接]

6

主题

40

帖子

40

积分

注册会员

Rank: 2

积分
40
发表于 2009-6-30 01:55:00 | 显示全部楼层

Re:游戏公司笔试题 回来的路上发觉做错了 ??

呵呵,你的想法是当遇到\t时,把\t之后的内容向后移动4个字节,然后在这4个字节的空位补足空格
可是传进来的字符串多半没有足够的空间给你,那肯定溢出了,其实不管你怎么想,只要在源字符串中替换的做法都存在溢出的问题
你可以用 char* buf="abc\tdef";试试你的函数看看会怎样

至于Devil的原型,提供了一个指针的指针,这就代表可以在函数内部分配新的空间作为输出,这样就没问题了,怎么实现还是自己想想吧,除此以外,在函数外提供足够大的空间作为输出也可以

4

主题

46

帖子

46

积分

注册会员

Rank: 2

积分
46
发表于 2009-6-30 09:06:00 | 显示全部楼层

Re:游戏公司笔试题 回来的路上发觉做错了 ??

有没有使用int Space_Exchange(const char* src, char** dest);函数的一个例子?
比如像这个样子的:
void Space_Exchange(char * src)
{
        for (int i = 0; i < strlen(src); ++i)
        {
                if (src == '\t')
                {
                        memcpy(&src[i + 4], &src[i + 1], strlen(&src[i + 1]));
                        for (int j = i; j < i + 4; ++j)
                        {
                                src[j] = ' ';
                        }
                }
        }
}

int main()
{
        char aaa[20];
        memset(aaa, 0, sizeof(aaa));
        aaa[0] = '1';
        aaa[1] = '2';
        aaa[2] = '\t';
        aaa[3] = '3';
        aaa[4] = '\t';
        aaa[5] = '4';
        Space_Exchange(aaa);
        return 0;
}

6

主题

40

帖子

40

积分

注册会员

Rank: 2

积分
40
发表于 2009-6-30 12:54:00 | 显示全部楼层

Re:游戏公司笔试题 回来的路上发觉做错了 ??

int Space_Exchange(const char* src, char** dest)
{
        *dest = new char[strlen(src)*4];
        char *pout = *dest, *p = (char*)src;

        int n = 0;

        while(*p)
        {
                if (*p == '\t')
                {
                        *(int*)pout = *(int*)"    ";
                        pout += 4;
                        ++n;
                }
                else
                {
                        *pout = *p;
                        ++pout;
                }
                ++p;
        }
       
        *pout = 0;

        return n;
}


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

        char* buf = "abcd\tefg";
        char* p = 0;

        Space_Exchange(buf, &p);

        SAFE_DELETE(p);
        return 0;
}

4

主题

46

帖子

46

积分

注册会员

Rank: 2

积分
46
发表于 2009-6-30 15:37:00 | 显示全部楼层

Re:游戏公司笔试题 回来的路上发觉做错了 ??

我觉得你这么写,比我那么写好多了。

1

主题

4

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2009-7-7 11:06:00 | 显示全部楼层

Re:游戏公司笔试题 回来的路上发觉做错了 ??

#include <string>

using namespace std;

const string&  replace(string &src, const string &find, const string &str)
{
    string::size_type pos = 0;

    for (;(pos = src.find(find, pos)) != string::npos;)
    {
        src.replace(pos,find.size(),str);
        pos += str.size();
    }
   
    return src;
}

int main(int argc, char *argv[])
{
    string src = "hello world\t";
    string str = replace(src,"\t","    ");

    return 0;
}

4

主题

19

帖子

19

积分

新手上路

Rank: 1

积分
19
发表于 2009-8-21 11:54:00 | 显示全部楼层

Re:游戏公司笔试题 回来的路上发觉做错了 ??

各位高手想得太多,其实就这么简单
void Space_Exchange(const char *src,char **dst)
{
        size_t srcLen = strlen(src);
        *dst = new char[srcLen + 3];
        memcpy(*dst,src,srcLen);
        memcpy(*dst+srcLen,"    ",4);
}

2

主题

50

帖子

50

积分

注册会员

Rank: 2

积分
50
发表于 2009-8-30 09:49:00 | 显示全部楼层

Re:游戏公司笔试题 回来的路上发觉做错了 ??

都写了些什么啊,tab不是用来对齐的么?

\t不是在行首的时候要计算需要补足的空格数,不能全部替换成4个空格

5

主题

34

帖子

34

积分

注册会员

Rank: 2

积分
34
发表于 2009-9-3 15:36:00 | 显示全部楼层

Re:游戏公司笔试题 回来的路上发觉做错了 ??

16L的让我看得好迷糊啊

12

主题

28

帖子

28

积分

注册会员

Rank: 2

积分
28
发表于 2009-9-4 09:20:00 | 显示全部楼层

Re: Re:游戏公司笔试题 回来的路上发觉做错了 ??

truetry: Re:游戏公司笔试题 回来的路上发觉做错了 ??

各位高手想得太多,其实就这么简单
void Space_Exchange(const char *src,char **dst)
{
        size_t srcLen ...

楼主题目是说把字符串中的\t替换成4个空格,不是把字符串末尾的\n替换成4个空格。

3

主题

101

帖子

101

积分

注册会员

Rank: 2

积分
101
发表于 2009-9-9 10:10:00 | 显示全部楼层

Re:游戏公司笔试题 回来的路上发觉做错了 ??

//原型
//链式表达
char * trans_T_2_4_space(const char *src, char *dst)//不用**, 容易误解, **=*&, 意为可能会改变dst的值,而不是dst所指的内容
{
  int i = 0;
  char * pdst = dst;
  while(*src)
  {
    if(*src == '\t')
    {
      while(i<4){*pdst++=' ';i++;}//可以参考13楼的,,但不是int,int在64位下,是8个字节
      i=0;
    }
    else
            *pdst++=*src;
    src++;
  }
  *pdst = '\0';//补上, 不过只要传进的缓冲经过初始化, 这个是没必要的, 有经验的程序员, 变量一般会初始化.

  return dst;
}


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-20 13:10

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表