asm, c, c++ are my all
-- Core In Computer
posts - 139,  comments - 123,  trackbacks - 0

/********************************************\
|    欢迎转载, 但请保留作者姓名和原文链接, 祝您进步并共勉!     |
\********************************************/


C与C++编程一头一尾最重要, 无数英雄折腰, 多少豪杰翻船!

作者: Jerry Cat
时间: 2006/04/22
链接: http://www.cppblog.com/jerysun0818/archive/2006/04/22/6086.aspx


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//Fuction: BOOL revstr(char *str);
//Purpose: reverse a string
//Author:  Jerry
//Time:     04/22/2006
//Feature: This version is suitable for both sring and char array

char* revstr(char *str)
{
    int nCnt = 0, len = strlen(str);
    char* tmpstr = (char*) malloc(len+1);
    if     (tmpstr) strcpy(tmpstr, str);
    else { printf("\n malloc error!\n"); return 0; }
    for(--len, tmpstr = tmpstr + len; len > 0; *str++ = *tmpstr--, --len, ++nCnt);
    *str = *tmpstr; //C/C++编程一头一尾最重要, 无数英雄折腰, 多少豪杰翻船!
    free(tmpstr);
    return str - nCnt;
}

上面方法不好, 繁杂且易出错, 经沐枫兄指点, 下面俩是改进版^_^
char* revstr(char *str)
{
    char c, *head = str, *tail = str + strlen(str) -1;
    for(; head < tail; c = *head, *head++ = *tail, *tail-- = c);
    return str;
}

char* revstr(char *str)
{   //省去一变量, 时间换空间法
    char *head = str, *tail = str + strlen(str) -1;
    for(; head < tail; *head=*head ^ *tail, *tail=*head ^ *tail, *head=*head++ ^ *tail--);
    return str;
}
 

posted on 2006-04-22 22:20 Jerry Cat 阅读(1091) 评论(7)  编辑 收藏 引用

FeedBack:
# re: C与C++编程一头一尾最重要, 无数英雄折腰, 多少豪杰翻船!
2006-04-24 09:23 | 沐枫
代码风格应该受到批评。
就这么几行的程序,就让人看得难以理解--特别是那个恐怖的for.
而且就本程序来说,没必要另外分配一个内存。

BTW: //Feature: This version is suitable for both sring and array
这个更离谱了,string还好说,array如何能用呢?  回复  更多评论
  
# re: C与C++编程一头一尾最重要, 无数英雄折腰, 多少豪杰翻船!
2006-04-24 09:58 | 沐枫
char* revstr(char* str){
  char* head = str;
  char* tail = head + strlen(head) -1;
  while(head < tail) {
    char c = *head;
    *head++ = *tail;
    *tail-- = c;
  }
  return str;
}  回复  更多评论
  
# re: C与C++编程一头一尾最重要, 无数英雄折腰, 多少豪杰翻船!
2006-04-24 13:15 | oosky
@沐枫
这个好多了。
  回复  更多评论
  
# re: C与C++编程一头一尾最重要, 无数英雄折腰, 多少豪杰翻船!
2006-04-25 00:51 | Jerry Cat
沐枫兄说得对:
1. 没必要另外分配一个内存了.
2. "array如何能用呢?", 忘加一定语:叫字符数组:)
3. 在你基础上又改了下, BTW, 都是面试惹的祸(你指风格不太好, 反正看它要求啦, 有的面官就要你用两行最多三行写完成某一功能的函数, 这种情况不要太多了:)

char* revstr(char *str)
{
char c, *head = str, *tail = str + strlen(str) -1;
for(; head < tail; c = *head, *head++ = *tail, *tail-- = c);
return str;
}

char* revstr(char *str)
{ //省去一变量, 时间换空间法
char *head = str, *tail = str + strlen(str) -1;
for(; head < tail; *head=*head ^ *tail, *tail=*head ^ *tail, *head=*head++ ^ *tail--);
return str;
}
  回复  更多评论
  
# re: C与C++编程一头一尾最重要, 无数英雄折腰, 多少豪杰翻船!
2006-04-25 09:10 | 沐枫
估计遇到这样的for语句,在某些大公司是会被警告直至走人的。
干嘛非要放到括号里完成呢?

另外,字符数组你这程序是不能用的。
我给你一个测试用例:
char arr[5] = {'H', 'e', 'l', 'l', 'o'};

----------
BTW,你如果要指定是C++,那么,C++中已经有reverse函数(头文件algorithm):
reverse(str, str+strlen(str)-1);
而交换变量,也有swap函数(头文件algorithm):
swap(*head++, *tail--);  回复  更多评论
  
# re: C与C++编程一头一尾最重要, 无数英雄折腰, 多少豪杰翻船!
2006-04-25 18:31 | Jerry Cat
1. "估计遇到这样的for语句,在某些大公司是会被警告直至走人的。
干嘛非要放到括号里完成呢?"
---------------------------
答: 面试惹的祸, 有的面官就要你用两行最多三行写完成某一功能的函数. 咱又不是不会用所谓"好"风格的for和while. 它需要啥咱就给它啥, 咱要工作! 它不需警告, 只要它皱眉头, 咱就改, 咱还不是给逼的吗?

2. "另外,字符数组你这程序是不能用的。
我给你一个测试用例:
char arr[5] = {'H', 'e', 'l', 'l', 'o'};
------------------------------------------
答: 提的好, 它没有第六个字节放'\0'! 我指的是:
char arr[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
char arr[] = "Hello";
这样的"串"形字符数组, anyway you're a careful guy!

3. "BTW,你如果要指定是C++,那么,C++中已经有reverse函数(头文件algorithm):
reverse(str, str+strlen(str)-1);
而交换变量,也有swap函数(头文件algorithm):
swap(*head++, *tail--);
-----------------------------------------
答: 哈, 我没指传统C++, 或STL式C++, 看看头文件就知道了:)
在C中就有标准库函数: char* strrev(char* str);
可以直接调用滴, 我只是练手^_^ (BTW, 现在嵌入式开发可以用C++(以前只许ams和C哦), 但还不允许C++标准库STL), 不知贵公司的情况了:)

4. 欢迎沐枫兄多指教, 谢了!  回复  更多评论
  
# re: C与C++编程一头一尾最重要, 无数英雄折腰, 多少豪杰翻船![未登录]
2011-06-03 15:20 | z
"*tail = str + strlen(str) -1;"

char* tail = str;
while(*tail) ++tail;
--tail;

//remove the reference to strlen() :)  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理



<2006年9月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

常用链接

留言簿(7)

随笔档案

最新随笔

搜索

  •  

最新评论

阅读排行榜

评论排行榜