zoukankan      html  css  js  c++  java
  • C++几个小函数

    之前看书,遇到几个编程题,要实现一些库自带的函数。于是动手写了写,并且做了一些测试。今晚在测试的时候,还发现了一些其他内存分配的问题,顺路一起记下。这里只写了字符串转整型,字符串赋值函数。


    #include <cctype>
    /*C库函数,将字符串转换成整型*/
    int my_atoi(const char* p);
    /*C库函数,复制源字符串到目的字符串,返回新串*/
    char *my_strcpy(char *dest, const char *src);
    /*C库函数,返回子串*/
    char *my_strstr(const char *s1, const char *s2);
    源文件
    #include <iostream>
    #include <cassert>
    #include "Deamo_functions.h"
    using namespace std;
    int my_atoi(const char* p)
    {
    	assert(NULL != p);
    	bool neg_flag = false;
    	int res = 0;
    	if(p[0] == '+' || p[0] == '-')
    		neg_flag = (*p++ != '+');
    	while(isdigit(*p))
    	{
    		res = res * 10 + (*p++ - '0');
    	}   
            return neg_flag ? 0 - res : res;
    }
    
    char *my_strcpy(char *dest, const char *src)
    {
        assert(dest!=NULL && src!=NULL);
        char* addr = dest;
        while((*dest++ = *src++)!='');
          return addr;
    } 
    
    char *my_strstr(const char *s1, const char *s2)
    {
    	int n;
    	if(*s2)
    	{
    		while(*s1)
    		{
    			for(n=0; *(s1+n) == *(s2+n); n++)
    			{
    				if(!*(s2+n+1))
    					return (char *)s1;
    			}
    			s1++;
    		}
    		return NULL;
    	}
    	else
    		return (char *)s1;
    }
    
    int main()
    {
      int result;
      result = my_atoi("3.2");
      cout<<"3.2 with my_atoi: "<<result<<endl;
      result = atoi("3.2");
      cout<<"3.2 with atoi: "<<result<<endl;
      cout<<"strcpy test........."<<endl;
      char* src = "hello!";
      //char* a = "a";
      //char* b = new char[2];
      //char c[] = "aaa";
      char* dest = new char[10];
      cout<<my_strcpy(dest,src)<<endl;
      getchar();
    }
    

    本来测试my_strcpy函数是照下面那样写的。

    cout<<"strcpytest........."<<endl;

              char* src = "hello!";

              char* dest = "123456789";

              cout<<my_strcpy(dest,src)<<endl;

    结果出现了下面的错误。发现src和dest的地址非常相近,如果src往后移动,就会指向dest了。这样的话产生地址访问出错了。想想内存分配的几条:

    1)静态分配,加static的采用全局分配。

    2)堆内分配,函数运行是编译器自动分配的。

    3)栈内分配,有程序员动态使用malloc或new分配


    那这个是属于哪一种呢。查了一下,貌似字符常量也单独扔到一块去。也就是说,dest和src现在指向了两个常量字符。所以,在my_strcpy函数中移动dest,src时,出现地址访问冲突了。所以,我们需要动态分配内存给dest。

    为了验证,上面的代码还特意定义了两个不相关的变量a和b。打个断点,看看他们的地址是不是和上面一样。如下图

     

    上图可以看出,dest和b是用new分配的,存放在相近的一段地址内。而src和a分别指向字符串常量,因此存放在另外一段相近的地址区域内。

     




    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    Zookeeper全解析——Paxos作为灵魂(转)
    Zookeeper全解析——Client端(转)
    zk 04之 Zookeeper Api(java)与应用
    zk 05之:ZooKeeper的配置
    ZooKeeper典型应用场景(转)
    ZooKeeper程序员指南(转)
    zk 01之 ZooKeeper概述
    zk 02之 Windows安装和使用zookeeper
    缓存与数据库一致性之一:缓存更新设计
    Android开发学习之Intent具体解释
  • 原文地址:https://www.cnblogs.com/gxwang/p/4940867.html
Copyright © 2011-2022 走看看