C++笔记

来源:互联网 发布:做家常菜的软件 编辑:程序博客网 时间:2024/06/02 18:04

vs 2013 快捷键

文档 
1. 补全代码 : Ctrl+space 或者 alt + → 
2. 源码追踪 : F12 
3. 代码注释 :选中 先 Ctrl + K 然后 Ctrl + C 
4. 解开注释 : 选中 先 Ctrl + K 然后 Ctrl + U 
5. 格式化代码 : 选中 先 Ctrl + K 然后 Ctrl + F

strlen,wcslen,lstrlen函数与sizeof运算符

#ifdef UNICODE#define lstrlen  lstrlenW#else#define lstrlen  lstrlenA#endif
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

所以在Unicode下,lstrlen等同lstrlenW(LPCWSTR lpString),在非Unicode下等同lstrlenA(LPCSTR lpString)。而lstrlenW又等同于wcslen,lstrlenA又等同于strlen,只不过一个是C的标准函数,一个是WinAPI函数。 
所以只需讨论strlen,wcslen与sizeof的区别。

#include "stdafx.h"#include "windows.h"#include <iostream>using namespace std;int _tmain(int argc, _TCHAR* argv[]){ char str1[]="abcde"; char str2[]="我是中国人"; WCHAR str3[]=L"abcde"; WCHAR str4[]=L"我是中国人"; cout<<strlen(str1)<<endl; cout<<sizeof(str1)<<endl; cout<<endl; cout<<strlen(str2)<<endl; cout<<sizeof(str2)<<endl; cout<<endl; cout<<wcslen(str3)<<endl; cout<<sizeof(str3)<<endl; cout<<endl; cout<<wcslen(str4)<<endl; cout<<sizeof(str4)<<endl; cout<<endl;  return 0;}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

输出结果: 

6

10 
11


12


12 
由此可见,strlen返回的是字节数(对中英文不一致,中文占两个字节,不包括’/0’),而wcslen返回的是字符数(对中英文一致)。而sizeof返回的是字节数(包含’/0’,而’/0’在Unicode下也是占两个字节的)。

string 与char* char[]之间的转换

首先必须了解,string可以被看成是以字符为元素的一种容器。字符构成序列(字符串)。有时候在字符序列中进行遍历,标准的string类提供了STL容器接口。具有一些成员函数比如begin()、end(),迭代器可以根据他们进行定位。

注意,与char*不同的是,string不一定以NULL(‘\0’)结束。string长度可以根据length()得到,string可以根据下标访问。所以,不能将string直接赋值给char*。

  • string 转换成 char *

如果要将string直接转换成const char *类型。string有2个函数可以运用。

一个是.c_str(),一个是data成员函数。

例子如下:

string s1 = "abcdeg";const char *k = s1.c_str();const char *t = s1.data();printf("%s%s",k,t);cout<<k<<t<<endl;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

如上,都可以输出。内容是一样的。但是只能转换成const char*,如果去掉const编译不能通过。

那么,如果要转换成char*,可以用string的一个成员函数copy实现。

string s1 = "abcdefg";char *data;int len = s1.length();data = (char *)malloc((len+1)*sizeof(char));s1.copy(data,len,0);printf("%s",data);cout<<data;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • char *转换成string

可以直接赋值。

string s;char *p = "adghrtyh";s = p;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

不过这个是会出现问题的。

有一种情况我要说明一下。当我们定义了一个string类型之后,用printf(“%s”,s1);输出是会出问题的。这是因为“%s”要求后面的对象的首地址。但是string不是这样的一个类型。所以肯定出错。

用cout输出是没有问题的,若一定要printf输出。那么可以这样:

printf("%s",s1.c_str())
  • 1
  • 1
  • char[] 转换成string

这个也可以直接赋值。但是也会出现上面的问题。需要同样的处理。

  • string转换成char[]

这个由于我们知道string的长度,可以根据length()函数得到,又可以根据下标直接访问,所以用一个循环就可以赋值了。

这样的转换不可直接赋值。

    string pp = "dagah";    char p[8];    int i;    for( i=0;i<pp.length();i++)        p[i] = pp[i];    p[i] = '\0';    printf("%s\n",p);    cout<<p;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

链表创建

  • 尾插法
struct ListNode {    int val;    ListNode *next;    ListNode(int x) : val(x), next(NULL) {}};ListNode* create(){    ListNode* head =new ListNode(0);    ListNode* temp = head;    for(int i=0 ; i < 10 ; i++)    {        ListNode* p = new ListNode(i+1);        temp->next = p;        temp = p;    }    return head;}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 头插法
ListNode* create(){    ListNode* head =new ListNode(0);    for(int i=0 ; i < 10 ; i++)    {        ListNode* p = new ListNode(i+1);        p->next=head->next;        head->next=p;    }    return head;}
0 0
原创粉丝点击