<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 \n", cs_1); //2 const char* --> string
const char *cs_2 = "lsw";
std::string s_2(cs_2);
printf("std::string s_2 is %s\n", 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 \n"<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++) != '\0') {
continue;
} return res;
} int myStrLen(const char* str) {
assert(str != nullptr);
auto len = 0;
while (*str++ != '\0') {
++ len;
} return len;
}

其他的一些知识

1、sizeof 和 strlen

char a[] = "12";
//这里sizeof输出 3 是a的位数包括 '\0'
cout << sizeof(a) << endl; char *p = a;
//输出 8,是指针p的字节数
cout << sizeof(p) << endl; char *str = "12";
//输出 2,不包含'\0'
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] = '\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++ != '\0') {
++len;
} return len;
}

随机推荐

  1. C# 为WebBrowser设置代理,打开网页

    WebBrowser控件是基于IE浏览器的,所以它的内核功能是依赖于IE的,相信做.NET的人都知道. 今天的主题,和上一篇文章应该是差不多的,都是通过代理来实现功能的. 请看下面的代码: //1.定 ...

  2. Git超级实用使用教程

    一篇git入门实用教程,原文地址http://www.cnblogs.com/tugenhua0707/p/4050072.html 一:Git是什么? Git是目前世界上最先进的分布式版本控制系统. ...

  3. C++ new、delete

    C++中向系统申请堆内存的方法为使用new.new[]操作符,new申请单个对象的内存,new[]申请对象数组的内存.对应的delete.delete[]操作符将new.new[]操作符申请到的内存还 ...

  4. Machine Learning for hackers读书笔记(五)回归模型:预测网页访问量

    线性回归函数 model<-lm(Weight~Height,data=?) coef(model):得到回归直线的截距 predict(model):预测 residuals(model):残 ...

  5. bzoj4026

    直接按照欧拉函数的计算方式来即可 φ=区间积*区间出现(质数-1)的积/区间出现过的质数的积 区间积是满足类似区间减法的操作的(利用逆元) 由于强制在线,上主席树就可以了(维护每个质数上次出现的位置p ...

  6. HDU 1950 Bridging signals

    那么一大篇的题目描述还真是吓人. 仔细一读其实就是一个LIS,还无任何变形. 刚刚学会了个二分优化的DP,1A无压力. //#define LOCAL #include <iostream> ...

  7. POJ 2724 Purifying Machine (二分图匹配)

    题意 给定m个长度为n的01串(*既表示0 or 1.如*01表示001和101).现在要把这些串都删除掉,删除的方法是:①一次删除任意指定的一个:②如果有两个串仅有一个字符不同,则可以同时删除这两个 ...

  8. HDU 5327 Olympiad (水题)

    题意:beautiful数字定义为该数字中的十进制形式每一位都不同,给一个区间[L,R],求该区间中有多少个beautiful数字. 思路:数字不大,直接暴力预处理,再统计区间[1,i]有多少个,用c ...

  9. RequireJS入门(三)转

    这篇来写一个具有依赖的事件模块event.event提供三个方法bind.unbind.trigger来管理DOM元素事件. event依赖于cache模块,cache模块类似于jQuery的$.da ...

  10. 谷歌浏览器如何设置可以解决Ajax跨域问题?

    Ajax本身是不支持跨域的,跨域问题其实很简单,通过浏览器的相应设置可以完成两个不同的服务器或两个不同服务下的项目互相访问.希望大家给予评价及投票. 方法/步骤   首先谷歌快捷方式上右击,在下拉列表 ...