• c++一些问题总结


    <span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"><span style="font-size:18px;">这里总结一些c++常遇到的问题</span></span>

    不同类型之间的转换。

    <span style="font-size:18px;">//1 string --> const char*
        std::string s_1 = "lsw";
        const char *cs_1 = s_1.c_str();
        printf("const char * cs is %s 
    ", cs_1);
        
        //2 const char* --> string
        const char *cs_2 = "lsw";
        std::string s_2(cs_2);
        printf("std::string s_2 is %s
    ", s_2.c_str());
        
        //3 string --> char*
        std::string s_3 = "lsw";
        char *cs_3;
        auto len = s_3.length();
        cs_3 = new char[len + 1];
        char *res_3 = strcpy(cs_3, s_3.c_str());
        printf("string to char* === %s", res_3);
        
        //4 char* --> string
        char *cs_4 = "lsw"; //c++ 11标准中这里有警告,不推荐这么用
        std::string s_4(cs_4);
        
        //5 const char* --> char *
        const char* cs_5 = "lsw";
        char *cs_6 = new char[100];//足够大
        char *res_5 = strcpy(cs_6, cs_5);    </span><p class="p1"><span style="font-size:18px;"><span class="s1">    printf</span><span class="s2">(</span>"cs_6 = %s 
    "<span class="s2">, cs_6);</span></span></p><p class="p1"><span class="s2"><span style="font-size:18px;">
    </span></span></p>

    string, const char* ---> int, double, long

    <span style="font-size:18px;">double	atof(const char *);
    int	atoi(const char *);
    long	atol(const char *);</span>


    int --- > string

    <span style="font-size:18px;">    char buff[100];
        sprintf(buff, "%d", 990);
        std::string sb = buff;</span>


    已知strcpy的函数原型:char *strcpy(char *strDest, const char *strSrc)其中strDest 是目的字符串,strSrc 是源字符串。不调用C++/C 的字符串库函数,请编写函数 strcpy

    /**
     已知strcpy函数的原型是
     char *strcpy(char *strDest, const char *strSrc);
     其中strDest是目的字符串,strSrc是源字符串。
     (1)不调用C++/C的字符串库函数,请编写函数 strcpy
     (2)strcpy能把strSrc的内容复制到strDest,为什么还要char * 类型的返回值?
     答:为了 实现链式表达式。
     例如 int length = strlen( strcpy( strDest, “hello world”) );
     */
    char *myStrcpy(char *str1, const char *str2) {
        assert(str1 != nullptr && (str2 != nullptr));
        char *res = str1;
        while ((*str1++ = *str2++) != '') {
            continue;
        }
        
        return res;
    }
    
    int myStrLen(const char* str) {
        assert(str != nullptr);
        auto len = 0;
        while (*str++ != '') {
            ++ len;
        }
        
        return len;
    }


    其他的一些知识

    1、sizeof 和 strlen
    
    char a[] = "12";
    //这里sizeof输出 3 是a的位数包括 ''
    cout << sizeof(a) << endl; 
    
    char *p = a;
    //输出 8,是指针p的字节数
    cout << sizeof(p) << endl;
    
    char *str = "12";
    //输出 2,不包含''
    cout << strlen(str) << endl;
    
    2、宏定义
    #define Min(a, b) ((a)>=(b)?(b):(a))
    
    3、string定义
    
    .h
    //
    //  MyString.h
    //  TestCPP
    //
    //  Created by lsw on 14-12-24.
    //  Copyright (c) 2014年 lsw. All rights reserved.
    //
    
    #ifndef __TestCPP__MyString__
    #define __TestCPP__MyString__
    
    #include <stdio.h>
    class MyString {
    public:
        MyString(const char *str = NULL); // 普通构造函数
        MyString(const MyString &other); // 拷贝构造函数
        ~MyString(void); // 析构函数
        MyString & operator =(const MyString &other); // 赋值函数
    private:
        char *m_data; // 用于保存字符串
        
    private:
        int myStrlen(const char* str);
    };
    
    #endif /* defined(__TestCPP__MyString__) */
    
    
    
    .cpp
    //
    //  MyString.cpp
    //  TestCPP
    //
    //  Created by lsw on 14-12-24.
    //  Copyright (c) 2014年 lsw. All rights reserved.
    //
    
    #include "MyString.h"
    #include <iostream>
    #include <assert.h>
    
    MyString::MyString(const char* str) {
        if (str == nullptr) {
            m_data = new char[1];
            m_data[0] = '';
        } else {
            auto len = myStrlen(str);
            m_data = new char[len + 1];
            assert(m_data != nullptr);
            strcpy(m_data, str);
        }
    }
    
    MyString::MyString(const MyString &other) {
        auto len = strlen(other.m_data);
        m_data = new char[len + 1];
        assert(m_data != nullptr);
        strcpy(m_data, other.m_data);
    }
    
    MyString::~MyString() {
        delete [] m_data;
    }
    
    MyString & MyString::operator=(const MyString &other) {
        if (this == &other) {
            return *this;
        }
        
        delete [] m_data;
        auto len = strlen(other.m_data);
        m_data = new char[len + 1];
        assert(m_data != nullptr);
        strcpy(m_data, other.m_data);
        return *this;
    }
    
    int MyString::myStrlen(const char *str) {
        assert(str != nullptr);
        
        int len = 0;
        while (*str++ != '') {
            ++len;
        }
        
        return len;
    }







  • 相关阅读:
    前端常用设计模式和工作中应用场景思考
    webpack从零开始打造react项目(更新中...)
    操作系统-进程
    go语言web框架-如何使用gin教程+react实现web项目
    JavaScript逗号运算符的用法
    react的生命周期和使用
    在Vue项目中使用wangEditor
    TypeScript实现axios
    SpringBoot整合邮件发送(thymeleaf和freemarker)
    SpringBoot整合RabbitMQ
  • 原文地址:https://www.cnblogs.com/shiweihappy/p/4246380.html
Copyright © 2020-2023  润新知