| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 622 人关注过本帖
标题:考考您的实际动手编程的能力(c语言)
只看楼主 加入收藏
wsj3000
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:78
专家分:161
注 册:2009-8-4
结帖率:66.67%
收藏
已结贴  问题点数:20 回复次数:7 
考考您的实际动手编程的能力(c语言)
编一个函数,输入一个字符串,要求做一个新字符串,把其中所有的一个或多个连续的空白字符都压缩为一个空格。这里所说的空白包括空格、'\t'、'\n'、'\r'。例如原来的字符串是:

"This Content hoho       is ok\
        ok?\
        file system\
uttered words   ok ok      ? end.   "
压缩了空白之后就是:

This Content hoho is ok ok? file system uttered words ok ok ? end.实现该功能的函数接口要求符合下述规范:

char *shrink_space(char *dest, const char *src, size_t n);各项参数和返回值的含义和strncpy类似。
注意:压缩后,开头和结尾不能有空格

原问题出处:http://learn.
看看你几次能够完全正确的实现,我用了3次,第一次看错题,第二次忘了处理末尾的空格,第三次才完成的;希望您比我做的更好!~~~
搜索更多相关主题的帖子: c语言 考考 能力 
2010-03-27 23:57
ldg628
Rank: 12Rank: 12Rank: 12
等 级:火箭侠
威 望:3
帖 子:526
专家分:3036
注 册:2009-6-23
收藏
得分:0 
#define IsBlank(x)  (x == ' ' || x == '\r' || x == '\n' || x == '\t')
char *shrink_space(char *dest, const char *src, size_t n)
{
    int i = 0, j = 0, flag = 0;
    while (src[i])
    {
        if (IsBlank(src[i]))
        {
            if (flag == 1)
            {
                dest[j] = ' ';
                if(src[i+1] == 0)
                {
                    break;
                }else if (!IsBlank(src[i+1]))
                {
                    j ++;
                }
            }
        }else
        {
            flag = 1;
            dest[j++] = src[i];
        }
        i ++;
    }
    dest[j] = 0;
    return dest;
}
2010-03-28 00:44
wsj3000
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:78
专家分:161
注 册:2009-8-4
收藏
得分:0 
恩,楼上的,好像你忘记了 size_t n这个参数,他是说拷贝n个字符到dest,而且要求最后一个字符(第n个)是'\0'结尾;而且要求dest中第一个'\0'之后到最后一个字符都只能是'\0'----具体参考strcpy()的定义;
2010-03-28 15:12
ldg628
Rank: 12Rank: 12Rank: 12
等 级:火箭侠
威 望:3
帖 子:526
专家分:3036
注 册:2009-6-23
收藏
得分:20 
#define IsBlank(x)  (x == ' ' || x == '\r' || x == '\n' || x == '\t')
char *shrink_space(char *dest, const char *src, size_t n)
{
    int i = 0, j = 0, len = 0, flag = 0;
    memset(dest, 0, n);
    if (n == 0)
    {
        return dest;
    }
    while (src[i])
    {
        if (IsBlank(src[i]))
        {
            if (flag == 1)
            {
                dest[j] = ' ';
                if(src[i+1] == 0)
                {
                    break;
                }else if (!IsBlank(src[i+1]))
                {
                    j ++;
                    if (j == n)break;
                }
            }
        }else
        {
            flag = 1;
            dest[j++] = src[i];
            if (j == n)break;
        }
        i ++;
    }
    dest[j] = 0;
    return dest;
}
不知道楼主还有什么要求。。。。
2010-03-28 16:15
longlong89
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:广州
等 级:小飞侠
威 望:6
帖 子:1043
专家分:2754
注 册:2009-8-18
收藏
得分:0 
分...

想象力征服世界
2010-03-28 20:53
wsj3000
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:78
专家分:161
注 册:2009-8-4
收藏
得分:0 
恩,正确了,虽然有一个参数没有用到,len=0;给您分~~~
2010-03-29 12:11
wsj3000
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:78
专家分:161
注 册:2009-8-4
收藏
得分:0 
我的代码,第三次写的~~~
#ifndef IS_SPACE_F
#define IS_SPACE_F
#define is_space(p) (*p == ' ' || *p == '\n' || *p == '\t' || *p == '\r')
#endif //注意这个宏定义函数不能使用is_space(src++)的形式,因为src++自增加产生的副作用会影响下个判断

char *shrink_space(char *dest, const char *src, size_t n)
{
    char * dest_tmp = dest;

    for(; is_space(src); src++); //忽略src开头的"空格"
    if(n != 0){
        *dest++ = *src++;
        for(n--; n>=1 && *(dest-1)!='\0'; n--){
            if(*(dest-1)==' '){
                for(; is_space(src); src++); //如果上个字符是空格,当前的一定不能是空格
                *dest++ = *src++;
            }else{ //如果上个字符不是空格,当前字符可以是非空格,包括'\0'
                *dest = is_space(src) ? ' ' : *src;
                dest++, src++;
            }
        }

        if(*(dest-1)=='\0' && *(dest-2)==' '){ //当n > strlen(src);
            *(dest-2) = '\0';
        }
        for(; n>=1; n--){
            *dest++ = '\0';
        }
    }
    return dest_tmp;
}
2010-03-29 12:31
polestar高明
Rank: 2
等 级:论坛游民
帖 子:48
专家分:37
注 册:2010-3-27
收藏
得分:0 
楼主太客气
还您您的叫 ^_^
2010-03-29 19:05
快速回复:考考您的实际动手编程的能力(c语言)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.039229 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved