>第 24 章 函数接口>本章的预备知识>strcpy与strncpy>习题

码匠 code_smith@sohu.com
2009-09-30 12:39:22

char *strcpy(char *dest, const char *src) {
	while (*src != '\0')
		*dest++ = *src++;
	*dest = '\0';

	return dest;
}


码匠 code_smith@sohu.com
2009-09-30 14:27:43

#include <stdio.h>

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

	for (; *src == ' ' || *src == '\t' || *src == '\n'; src++);
	for (i = 0; i < n && *src; i++) {
		dest[i] = (*src == ' ' || *src == '\t' || *src == '\n') ? ' ' : *src;
		if (*src != ' ' && *src != '\t' && *src != '\n') 
			src++;
		else
			while (*src == ' ' || *src == '\t' || *src == '\n') 
				src++;
	}
	for (; i < n; i++)
		dest[i] = '\0';
}

char *strcpy(char *dest, const char *src) {
	while (*src != '\0')
		*dest++ = *src++;
	*dest = '\0';

	return dest;
}

int main(void) {
	char dest[100];
	const char *src =	"This Content hoho       is ok"
				"        ok?"
				""
				"        file system"
				"uttered words   ok ok      ?"
				"end.";

	shrink_space(dest, src, sizeof(dest));
	printf("%s\n",dest);
}

SHRINK_SPACE(3)		Linux Programmer's Manual	SHRINK_SPACE(3)

NAME
	shrink_space - shrink space in a string
SYNOPSIS
	char *shrin_space(char *dest, const char *src, size_t n);
DESCRIPTION
	The shrink_space() function shrinks continuous blank spaces of a string pointed 
	to by src, into a whitespace, and saves the result into a buffer pointed to by 
	dest.

	If the leading letters are blank spaces, they will be removed until the fist non-
	blank letter appears. If the length of shrinked string of src is more than n, only
	n letters are saved into dest, not inluding the terminating null byte ('\0').
RETURN VALUE
	The function returns a pointer to the destination string dest.
COFORMING TO
	Mr. Song's standard
NOTES
	If the destination string dest is not long enough to hold all shrinked letters of the
	source strin src including terminating null by, shrink_space() produce an unterminated 
	string in dest. Programmers often prevent this mistake by forcing termination as follows:
		
		shrink_space(dest, src, n);
		if (n > 0)
			dest[n - 1] = '\0';
BUGS
	No program has not a bug. Take it easy!
SEE ALSO
	http://learn.akae.cn/media/ch24s01.html
COLOPHON
	This page is part of homework of ONE STOP LEARING LINUX C
CYS			2009-09-30		SHRINK_SPACE

Oh, God! Tomorrow is the national holiday, and the splendid military parade for the country's 
60 aniversary is coming up soon. But I will be on the train to my hometwon. What a regret! 
How do I spend this holiday, maybe continute studying the course!  May everyone has an energetic,
relax holiday!


宋劲杉 songjinshan@gmail.com
2009-09-30 17:25:04

哈哈!这个要顶!你太有才了!


宋劲杉 songjinshan@gmail.com
2009-09-30 17:25:45

第一道习题你写了4行函数体,要求是3行:)


张超 uestczhangchao@gmail.com
2009-12-01 10:59:11

char *strcpy(char *dest, const char *src)
{
	char *tmp = dest;//必须先把dest的地址存下来
	while (*src != '\0')
		*dest++ = *src++;
	*dest = '\0';

	return tmp;
}


张超 uestczhangchao@gmail.com http://learn.akae.cn/akabook/ch24s01_3
2009-12-01 10:59:53

char *strcpy(char *dest, const char *src)
{
	char *tmp = dest;//必须先把dest的地址存下来
	while (*src != '\0')
		*dest++ = *src++;
	*dest = '\0';

	return tmp;
}


吴书杰 wsj3000@gmail.com
2010-03-25 14:47:54

char * strcpy(char * des, const char * src)
{
	char * dst_tmp = des;
	while((*des++ = *src++) != '\0');
	return dst_tmp;
}
三行代码额,呵呵,不过不是太标准的。
char *shrink_space(char *dest, const char *src, size_t n)
{
	char * dest_tmp = dest;
	for(; n>=1; n--){
		*dest = *src++;
		switch(*dest){
		case ' ':
			break;
		case '\t':
			break;
		case '\n':
			break;
		case '\r':
			break;
		default:
			dest++;
		}
	}
	return dest_tmp;
}
考虑if else,switch,还是switch好看些。


吴书杰 wsj3000@gmail.com
2010-03-27 03:26:26

不好意思,没看清题上个程序是错误,正确的是这样的:
char *shrink_space(char *dest, const char *src, size_t n)
{
	char * dest_tmp = dest;

	while(is_space(src++)); // find the first not 'space' character;
	*dest++ = *(src-1);
	//the codes above will ignore the beginning 'space'es of 'src';
	for(; n>=2; n--){
		if(*(dest-1) != ' '){ // if last character is not 'space';
			is_space(src) ? (*dest++ = ' ',src++) : (*dest = *src++, dest++);
		}else{
			while(is_space(src++));
			*dest++ = *(src-1);
		}
	}
	*(dest-1) = '\0'; //whether it is ' ' or not, the ending character must be '\0';

	return dest_tmp;
}

inline int is_space(const char * pch)
{
	return (*pch == ' ' || *pch == '\n' || *pch == '\t' || *pch == '\r');
}


吴书杰 wsj3000@gmail.com
2010-03-27 22:42:21

不好意思,上个还是有问题的,最终版本如下:
#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开头的"空格"
	*dest++ = *src++;

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

	if(*(dest-2)==' ') //倒数第2个字符一定不能是空格
		*(dest-2) = '\0';
	for(dest--, n++; n>=1; n--){ //无论n够不够,从dest中的'\0'字符(或者第n个字符,此时dest-1指向
		*dest++ = '\0';          //第n个字符)到第n个字符都一定是'\0';(第n个就是最后一个字符)
	}

	return dest_tmp;
}


ben benzhemin@gmail.com
2010-07-26 14:38:42

#include <stdio.h>

char *strcpy(char *dest, const char *src);

int main(void){
    char *a = "hello world";
    char b[20] ;
    printf("%s\n", strcpy(b, a));
    return 0;
}

char *strcpy(char *dest, const char *src){
    char *deshead = dest;
    for(;(*dest++=*src++)!='\0';);
    return deshead;
}


Ben benzhemin@gmail.com
2010-07-26 15:18:23

很简单的一个题,不知道为啥写那么复杂
char *shrink_space(char* dest, const char* src, size_t n){
    char *deshead = dest;
    int space = 0;
    for(int i=0; i<n; i++){
        if((*src)=='\t' || (*src)=='\n' || (*src)=='\r' || (*src)== ' '){
            if(space == 0){
                *dest++ = ' ';
                space = 1;
            }else{
                src++;
            }
        }else{
            *dest++ = *src++;
            space = 0;
        }
    }
    *dest = '\0';
    return deshead;
}

man page 就不写了,没有1楼那么有才。。。


laciqs 530107999@qq.com
2010-08-11 16:05:02

char *strcpy(char *dest, const char *src)
{
        while (*dest++ = *src++)
                ;
        return dest;
}


laciqs 530107999@qq.com
2010-08-11 16:09:22

忘了保存最初的dest- -!


laciqs 530107999@qq.com
2010-08-11 16:44:18

还是写不出真正的三行代码……


Louis alzl333@sina.com
2010-08-25 22:35:09

char *strcpy(char *dest,const char *src) { 
	char *destcopy = dest;
	while ((*dest++ = *src++) != '\0');
	return destcopy;
}


kevin hzk47st@126.com
2010-11-11 23:03:56

char* shrink_blank(char *dest,const char *src,size_t n)
{
size_t i=0;

for(i=0;i<n && *src != '\0';src++)
{
	if(*src != '\t' && *src != '\n' && *src != '\r' && *src != ' ')
		dest[i++]=*src;
	else if(i>0 && dest[i-1] != ' ')
		dest[i++] = ' ';

}

for(;i<n;i++)
	dest[i]='\0';

return dest;
}

// 这样写对吗?不知道边界对不对。。


kevin hzk47st@126.com
2010-11-11 23:10:04

char* shrink_blank(char *dest,const char *src,size_t n)
{
size_t i=0;

for(i=0;i<n && *src != '\0';src++)
{
	if(*src != '\t' && *src != '\n' && *src != '\r' && *src != ' ')
		dest[i++]=*src;
	else if( (i>0 && dest[i-1] != ' ') || i==0 )
		dest[i++] = ' ';

}

for(;i<n;i++)
	dest[i]='\0';

return dest;
}

// 这样写对吗?不知道边界对不对。。
// 再fix一下,不过感觉效率不高。。


吴亚杰 yajie.wu@hotmail.com
2010-12-16 10:01:14

char *strcpy(char *dest, const char *src)
{
        char *dest_tmp=dest;
        while ((*dest++ = *src++)!='\0');
        return dest_tmp;
}


xrumerzahghw xrumerzahghw@gmail.com http://www.xrumermaster.com/
2011-02-18 11:29:19

Hello guys Just offering a top quality <a href=http://www.xrumermaster.com>Backlinks Service</a>, We all know that more backlinks equal more Page rank, and more page rank get more visitors to your website and more visitors equal more money so come an check the Greatest & Cheaper  <a href=http://www.xrumermaster.com>Profile Backlinks</a> on the net on <a href=http://www.xrumermaster.com>XrumerMaster.com</a>


tang tang@sina.com
2011-03-25 16:25:09

char *strcpy(char *dst, const char* src)
{
	int i;
	for(i=0; src[i] != '\0';dst[i] = src[i],i++)
	return dst;
}


tang tang@sina.com
2011-04-01 12:03:29

char *shrink_space(char *dst, const char *src, size_t n)
{
//assert(dst==null || src == null)
	char *ret = dst;
	if(*src!='\0')
		if (*src==' '|| *src=='\t' || *src=='\r' || *src=='\n')
			*dst++ = ' ';
		else
			*dst++ = *src++;
	while(*src!='\0') {
		while(*(dst-1)==' ' && (*src==' '|| *src=='\t' || *src=='\r' || *src=='\n'))
			++src;
		if (*src==' '|| *src=='\t' || *src=='\r' || *src=='\n')
			*dst++ = ' ';
		else
			*dst++ = *src++;
	}
	*dst = '\0';
	return ret;
}


chen liang liang epstein_2002@yahoo.com.cn
2011-11-02 11:12:38

偶的答案:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *shrink_space(char *dest, const char *src, size_t n)
{
	char *dest_old=dest;
	char *tmp_str=malloc(strlen(src)+1);
	char *dest_tmp=tmp_str;
	
	if(!tmp_str)
		return NULL;
	*dest='\0';
	while(*src!='\0')
	{
		dest_tmp=tmp_str;
		while(*src!='\n' && *src!='\t' && *src!='\r' && *src!=' ')
		{
			*dest_tmp++=*src++;						
		}
		*dest_tmp='\0';
		if(strlen(tmp_str)!=0)
		{	
			strcat(dest,tmp_str);
			strcat(dest," ");
		}
		src++;
	}
	free(tmp_str);
	tmp_str=NULL;
	return dest_old;
}
int main(void) {
		char dest[100];	
		const char *src =	"This Content hoho       is ok\r\n"
							"        ok?\r\n"
							""
							"        file system\r\n"
							"uttered words   ok ok      ?\r\n"
							"end.\r\n";

		shrink_space(dest, src, sizeof(dest));
		printf("%s\n",dest);
		return 0;
}
欢迎评价!


goldmelon 759719925@qq.com
2011-12-31 20:14:41

#include <stdio.h>
char *strcpy(char *dest, const char *src)
{
        for(char *tmp = dest; ;src++,dest++)
                if(*dest = *src == '\0')
                        return tmp;
}


如果您有建设性意见,哪怕只是纠正一个错别字,也请不吝赐教,您留下的姓名和email将会出现在本书前言的致谢中。再次感谢您的宝贵意见!