char *strcpy(char *dest, const char *src) {
while (*src != '\0')
*dest++ = *src++;
*dest = '\0';
return dest;
}#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!
哈哈!这个要顶!你太有才了!
第一道习题你写了4行函数体,要求是3行:)
char *strcpy(char *dest, const char *src)
{
char *tmp = dest;//必须先把dest的地址存下来
while (*src != '\0')
*dest++ = *src++;
*dest = '\0';
return tmp;
}char *strcpy(char *dest, const char *src)
{
char *tmp = dest;//必须先把dest的地址存下来
while (*src != '\0')
*dest++ = *src++;
*dest = '\0';
return tmp;
}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好看些。不好意思,没看清题上个程序是错误,正确的是这样的:
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');
}不好意思,上个还是有问题的,最终版本如下:
#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;
}
#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;
}很简单的一个题,不知道为啥写那么复杂
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楼那么有才。。。char *strcpy(char *dest, const char *src)
{
while (*dest++ = *src++)
;
return dest;
}忘了保存最初的dest- -!
还是写不出真正的三行代码……
char *strcpy(char *dest,const char *src) {
char *destcopy = dest;
while ((*dest++ = *src++) != '\0');
return destcopy;
}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;
}
// 这样写对吗?不知道边界对不对。。
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一下,不过感觉效率不高。。
char *strcpy(char *dest, const char *src)
{
char *dest_tmp=dest;
while ((*dest++ = *src++)!='\0');
return dest_tmp;
}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>
char *strcpy(char *dst, const char* src)
{
int i;
for(i=0; src[i] != '\0';dst[i] = src[i],i++)
return dst;
}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;
}偶的答案:
#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;
}
欢迎评价!#include <stdio.h>
char *strcpy(char *dest, const char *src)
{
for(char *tmp = dest; ;src++,dest++)
if(*dest = *src == '\0')
return tmp;
}
如果您有建设性意见,哪怕只是纠正一个错别字,也请不吝赐教,您留下的姓名和email将会出现在本书前言的致谢中。再次感谢您的宝贵意见!