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分别指向字符串常量,因此存放在另外一段相近的地址区域内。

     




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

  • 相关阅读:
    20080619 SQL SERVER 输入 NULL 的快捷键
    20090406 Adobe的“此产品的许可已停止工作”错误的解决办法
    20080908 Office Powerpoint 2007 不能输入中文的解决办法
    20080831 ClearGertrude Blog Skin 's cnblogs_code class
    20080603 Facebook 平台正式开放
    20080519 安装 Microsoft SQL Server 2000 时提示 创建挂起的文件操作
    test
    Linux—fork函数学习笔记
    SOA的设计理念
    Why BCP connects to SQL Server instance which start with account of Network Service fail?
  • 原文地址:https://www.cnblogs.com/gxwang/p/4940867.html
Copyright © 2011-2022 走看看