觉得还是有必要把一些常用函数总结一下。方便自己复习,也可以方便自己改进。
如果有人不幸看到此文,真的恳请您能看一下以下函数,能指点一点是一点,十分感谢!
//原地反转字符串。虽然这里是原地反转,但是还是实现成带返回值的,这样返回值可以直接
//作为别的函数参数,即构成链式的。这种实现方式要记得!你老忘。。。
char *Reverse(char *src_str)
{
assert(src_str != NULL);
//这里再次提醒,如果参数str为const(假如),那这里des必须声明为const。
//编译器不报错,至少我这没有,但是毕竟不严谨
char *pStart = src_str;
char *pEnd =src_str;
while (*pEnd++ != '\0')
;
pEnd -= 2;
while (pStart < pEnd){
exchange(*pStart, *pEnd); //此处因为用的宏写的exchange,所以传的参数为指针值,而不是指针
++pStart;
--pEnd;
}
assert(pStart == pEnd || pStart - 1 == pEnd);
return src_str;
}
//这是个使用<string.h>函数库的版本的reverse,因为有的时候不让用函数库,
//所以这里实现了两个,当然assert不算啊。。不然还要自己定义什么值是错误的。。
//这里图简便
char *reverseUseLibrary(char *str)
{
assert(str != NULL);
int i,j,c;
for (i=0, j = strlen(str) -1; i < j; ++i, --j){
c = str[j];
str[j] = str[i];
str[i] = c;
}
return str;
}
//将字符串转换为int
int atoi(char *str)
{
assert(str != NULL);
char negtive = 0; //检测是否是负数
int retval = 0; //这个是真正返回值
unsigned int num = 0; //这个是怕溢出,弄了个中间值
unsigned int intLimit = (num - 1) / 2; //想法求了下机器int边界
//在C标准库中,库文件<limits.h>下,有个宏INI_MAX指示出 int的边界值
//但是这里我没用,用了个土法求int边界,主要还是怕库不让用,或者万一出现
//包含这个库出问题的情况。比如vc6.0。不知到为什么,我两台电脑,一个可以找到
//这个库文件,另一个找不到。。。晕了。。
while (*str == ' ')
++str;
if (*str == '-'){
negtive = 1;
++str;
}
while (*str != '\0'){
if (*str < '0' || *str >'9'){
printf("Invalidate argument\n");
return 0;
}
num *= 10;
num += *str++ - '0';
//检查看溢出没有
if ( num > intLimit){
printf("Overflow\n");
return 0;
}
}
/*注 overflow实现的比较笨拙,看网上有个人实现的时候,用c++可以这样,如下
* overflow
* if(num > std::numeric_limits
::max())
* {
* num = 0;
* break;
* }
*他检查了一下是否溢出,感觉这个挺好的,他的num设的long long型
*/
retval = (int)num;
return negtive == 1 ? 0 - retval : retval;
}
不知道是不是我使用方法不对,csdn上保存草稿总是出问题。没办法,先发出来吧。后面慢慢补充。谢谢