C++ 学习拾遗 —— 点滴记录C++学习过程中遇到的问题以及整理
2013-05-28 17:00
941 查看
[b]2013.5.28 delete []str;[/b]
今天在看老师课件的时候,看到析构函数里有一条语句:
有印象,但一时想不起来。遂查询了一下。
解释:
指针数组:
在C语言和C++语言中,数组元素全为指针的数组称为指针数组。
一维指针数组的定义形式为:“类型名 *数组标识符[数组长度]”。
例如,一个一维指针数组的定义:int *ptrarray[10]。
也可以:
char *str; //定义一个字符指针
str=new char[20]; //以数组的形式赋给str一片内存
delete []str; //释放字符指针数组的内存
[b]2013.5.29 返回引用 string&[/b]
今天查 string& ,看到个帖子不错。
上面的解释:
“string& 是返回引用,这个是C++的特有语法,返回引用的好处和指针类似,就是为了避免返回对象(构造函数等额外开销),提高程序效率。而且,引用和指针又不完全一样,它有其特殊的优点,可以参看C++Primmer中引用和指针的区别相关阐述。”
下面接着有人提问:
string& trim_string(string &s, const char *chars)
main()
{
trim_string("1234", '5');
}
这样调用出了问题啊,是“1234”这里错了,那我应该怎么改呢?
解释:
“你传的是const值,函数接受的是非const值,不行
要么把"1234"定义成std::string
要么把原来函数里面的参数写成const的 ”
当返回一个变量时,会产生拷贝。当返回一个引用时,不会发生拷贝。
2013.5.29 常成员函数
[b]常见形式:[/b]
const Time t1; ||
Time const t1; &&
void get_time() const;
性质:
1.常成员函数不能更新对象的数据成员
2.当一个对象被声明为常对象,则不能通过该对象调用该类中的非const成员函数
2013.8.2 数组初始化总结
整型数组初始化:
char a[3][4]={0};
字符数组初始化:
int b[3][4]={0};
布尔型数组初始化:
bool c[5]={0};
结构体初始化:
struct instruction{ //定义结构体,存储指令
int head; //识别指令
int d;
int n; //指令附加内容
}pro[1000]={0}; //存储程序体,相当于RAM
初始化之后都会变成0。
(char数组变为\000,int数组变为0,bool数组变为false,这个例子里的结构体所有元素的每一个成员值都为0)
2013.8.6 二维数组的引用作为函数参数传值
[b]样例 1:[/b]
[b]样例 2:[/b]
注意利用两种方式输出的不同,还有给words[0]和words[1]赋值的方式。
[b]输出结果都是[/b]:
[b]2013.8.6 C++错误提示[/b]
stray '\241' in program :该错误是指源程序中有非法字符,需要去掉非法字符。中文空格,中文引号, 中文各种标点符号,都会出现。
[b]2013.8.7 C++ string 成员函数[/b]
assign() —— 赋值
C++ string类的成员函数,用于拷贝、赋值操作,它们允许我们顺次地把一个string 对象的部分内容拷贝到另一个string 对象上。
有时候我们需要把一个字符串上的部分内容赋值给另一个字符串,而又觉得用for循环依次拷贝麻烦,这时候使用assign()函数就很方便了。个人认为是个很实用的string成员函数,记下来比较好。
[b]样例:[/b]
[b]2013.8.28 关于cin过滤[/b]
cin会过滤掉治表符,回车和空格的输入,cin输入默认分隔符是空格或者回车,也可以设置分隔符。
例如:
与
同时输入“123”并回车。
比较输出结果
前者:
后者为:
仔细观察会发现后者比前者多一行。这说明前者使用cin的从标准输入中读入数据的时候将回车过滤掉了,而后者使用getchar依次读取缓冲区中的字符然后输出,自然将回车也读入了。
两者都是输入的时候在控制台中打上一行字符串“123”,然后回车。按下回车的时候,就将字符串包括后面的回车符都放入到了键盘缓冲区里面,区别就是从缓冲区里面向外读的时候,cin忽略掉了回车符,而getchar照常读入。
这时候使用cin的要注意,缓冲区里面还残留着一个回车符,这在一些情况下,容易因为疏忽出现问题。
样例:
结果会出现这种情况:
第三行字符串还没输入的时候,结果就直接输出出来了,并且输出结果的开头还多出一空行。
原因就是读入整数n之后缓冲区里,还残留着一个回车符。所以getline会先读取回车符作为第一行字符串。
将代码改成这样就行了:
正确输入结果:
2013.9.8 char类型数据
今天发现一个平时没注意的细节,char字符类型默认是有符号型,也就是要拿出一位来存储正负号,这样1个char型数据所代表的数据范围就是128。
注意这个知识点,再看下面的例子。
[b]2013.12.17 C++的输出格式控制 - float数小数点显示位数[/b]
另:setprecision(6)可以恢复输出默认小数点位数。
[b] 2013.12.26 time.h头文件的测试学习[/b]
输出结果截图:
View Code
2015.5.1 求二进制中1的个数
一个简便算法:
Freecode : www.cnblogs.com/yym2013
今天在看老师课件的时候,看到析构函数里有一条语句:
delete []str;
有印象,但一时想不起来。遂查询了一下。
解释:
delete str1; //释放指针变量的内存 delete [] str1; //释放指针数组的内存(说是指针数组,也不是很准确)
指针数组:
在C语言和C++语言中,数组元素全为指针的数组称为指针数组。
一维指针数组的定义形式为:“类型名 *数组标识符[数组长度]”。
例如,一个一维指针数组的定义:int *ptrarray[10]。
也可以:
char *str; //定义一个字符指针
str=new char[20]; //以数组的形式赋给str一片内存
delete []str; //释放字符指针数组的内存
[b]2013.5.29 返回引用 string&[/b]
今天查 string& ,看到个帖子不错。
上面的解释:
“string& 是返回引用,这个是C++的特有语法,返回引用的好处和指针类似,就是为了避免返回对象(构造函数等额外开销),提高程序效率。而且,引用和指针又不完全一样,它有其特殊的优点,可以参看C++Primmer中引用和指针的区别相关阐述。”
下面接着有人提问:
string& trim_string(string &s, const char *chars)
main()
{
trim_string("1234", '5');
}
这样调用出了问题啊,是“1234”这里错了,那我应该怎么改呢?
解释:
“你传的是const值,函数接受的是非const值,不行
要么把"1234"定义成std::string
要么把原来函数里面的参数写成const的 ”
当返回一个变量时,会产生拷贝。当返回一个引用时,不会发生拷贝。
2013.5.29 常成员函数
[b]常见形式:[/b]
const Time t1; ||
Time const t1; &&
void get_time() const;
性质:
1.常成员函数不能更新对象的数据成员
2.当一个对象被声明为常对象,则不能通过该对象调用该类中的非const成员函数
2013.8.2 数组初始化总结
整型数组初始化:
char a[3][4]={0};
字符数组初始化:
int b[3][4]={0};
布尔型数组初始化:
bool c[5]={0};
结构体初始化:
struct instruction{ //定义结构体,存储指令
int head; //识别指令
int d;
int n; //指令附加内容
}pro[1000]={0}; //存储程序体,相当于RAM
初始化之后都会变成0。
(char数组变为\000,int数组变为0,bool数组变为false,这个例子里的结构体所有元素的每一个成员值都为0)
2013.8.6 二维数组的引用作为函数参数传值
[b]样例 1:[/b]
#include <iostream> #include <cstring> using namespace std; char words[1000][17]={0}; char ci[100][17]={0}; void decipher(char (&words)[17],char (&ci)[17]) //将二维数组作为一维数组传递进来 { cout<<words<<endl; //words[0] cout<<(words+17)<<endl; //words[1] } int main() { strcpy(words[0],"C++"); strcpy(words[1],"Java"); decipher(words[0],ci[0]); return 0; }
[b]样例 2:[/b]
#include <iostream> #include <cstring> using namespace std; char words[1000][17]={0}; char ci[100][17]={0}; void decipher(char (&words)[1000][17],char (&ci)[100][17])//将二维数组的引用直接传递进来 { cout<<*words<<endl; //words[0] cout<<*(words+1)<<endl; //words[1] } int main() { strcpy(words[0],"C++"); strcpy(words[1],"Java"); decipher(words,ci); return 0; }
注意利用两种方式输出的不同,还有给words[0]和words[1]赋值的方式。
[b]输出结果都是[/b]:
C++ Java
[b]2013.8.6 C++错误提示[/b]
stray '\241' in program :该错误是指源程序中有非法字符,需要去掉非法字符。中文空格,中文引号, 中文各种标点符号,都会出现。
[b]2013.8.7 C++ string 成员函数[/b]
assign() —— 赋值
C++ string类的成员函数,用于拷贝、赋值操作,它们允许我们顺次地把一个string 对象的部分内容拷贝到另一个string 对象上。
有时候我们需要把一个字符串上的部分内容赋值给另一个字符串,而又觉得用for循环依次拷贝麻烦,这时候使用assign()函数就很方便了。个人认为是个很实用的string成员函数,记下来比较好。
[b]样例:[/b]
1、string s1( "Mississippi" ); string s3; // 拷贝s1 的前4 个字符 s3.assign( s1, 0, 4 ); s3 现在的值为“Miss”。 2、 string str1, str2 = "War and Peace"; str1.assign( str2, 4, 3 ); cout << str1 << endl; 显示 and
[b]2013.8.28 关于cin过滤[/b]
cin会过滤掉治表符,回车和空格的输入,cin输入默认分隔符是空格或者回车,也可以设置分隔符。
例如:
while(cin>>c){ cout<<' '<<c; }
与
while(c=getchar()){ cout<<' '<<c; }
同时输入“123”并回车。
123
比较输出结果
前者:
1 2 3
后者为:
1 2 3
仔细观察会发现后者比前者多一行。这说明前者使用cin的从标准输入中读入数据的时候将回车过滤掉了,而后者使用getchar依次读取缓冲区中的字符然后输出,自然将回车也读入了。
两者都是输入的时候在控制台中打上一行字符串“123”,然后回车。按下回车的时候,就将字符串包括后面的回车符都放入到了键盘缓冲区里面,区别就是从缓冲区里面向外读的时候,cin忽略掉了回车符,而getchar照常读入。
这时候使用cin的要注意,缓冲区里面还残留着一个回车符,这在一些情况下,容易因为疏忽出现问题。
样例:
#include <iostream> #include <string> using namespace std; int main() { //用getline()读入n行字符串,并输出 int n; string s[100]; cin>>n; //读入n cout<<"input:"<<endl; for(int i=0;i<n;i++) //读入字符串 getline(cin,s[i]); cout<<"output:"<<endl; for(int i=0;i<n;i++) //依次输出字符串 cout<<s[i]<<endl; return 0; }
结果会出现这种情况:
3 input: 123 456 output: 123 456
第三行字符串还没输入的时候,结果就直接输出出来了,并且输出结果的开头还多出一空行。
原因就是读入整数n之后缓冲区里,还残留着一个回车符。所以getline会先读取回车符作为第一行字符串。
将代码改成这样就行了:
#include <iostream> #include <stdio.h> #include <string> using namespace std; int main() { //用getline()读入n行字符串 int n; string s[100]; cin>>n; //读入n getchar(); //将回车符消除 //注:C++中fflush(stdin)是清除文件缓冲区,文件以写方式打开时将缓冲区内容写入文件 cout<<"input:"<<endl; for(int i=0;i<n;i++) //读入字符串 getline(cin,s[i]); cout<<"output:"<<endl; for(int i=0;i<n;i++) //依次输出字符串 cout<<s[i]<<endl; return 0; }
正确输入结果:
3 input: 123 456 789 output: 123 456 789
2013.9.8 char类型数据
今天发现一个平时没注意的细节,char字符类型默认是有符号型,也就是要拿出一位来存储正负号,这样1个char型数据所代表的数据范围就是128。
注意这个知识点,再看下面的例子。
#include <iostream> using namespace std; int main() { char c='z'; char t=c+10; if(t>'z') //如果加10赋值后会再判断,t的值会超过127,转换成char就会砍掉一部分,输出就会出错 cout<<char(t-26)<<endl; else cout<<char(t)<<endl; /* 像这样直接+10再比较就不会自动转换,或者将上面的t改成 unsigned char 类型也可以 if(c+10 > 'z') cout<<char(c-26)<<endl; else cout<<char(c)<<endl; */ return 0; }
[b]2013.12.17 C++的输出格式控制 - float数小数点显示位数[/b]
#include <iostream> #include <iomanip> //C++的格式控制头文件 using namespace std; int main() { float M; int N; cin>>M>>N; float sum=0; while(N--){ sum+=M/2+M; M/=2; } cout<<setiosflags(ios::fixed); //带小数点的形式显示浮点数 cout<<setprecision(2); //和setiosflags(ios::fixed)合用就是控制浮点数显示的小数点位数 cout<<M<<' '<<sum-M<<endl; return 0; }
另:setprecision(6)可以恢复输出默认小数点位数。
[b] 2013.12.26 time.h头文件的测试学习[/b]
#include <iostream> #include <time.h> #include <stdio.h> #include <windows.h> using namespace std; int main() { time_t t = time(NULL); cout<<"从1970年1月1日到现在过去了 "; cout<<t/(365*24*60*60)<<" 年"<<endl<<endl; cout<<"char* ctime(time_t*)函数的使用,得到日历时间"<<endl; char* ct = ctime(&t); //得到日历时间 cout<<ct<<endl; cout<<"利用 struct tm* 结构体输出时间"<<endl; tm* curt = localtime(&t); cout<<1900 + curt->tm_year<<"年" <<1 + curt->tm_mon<<"月" //该月份tm_mon范围为0~11 <<curt->tm_mday<<"日"<<endl<<endl; cout<<"struct tm* gmtime(time_t*)函数的使用,得到GMT时间,同样也是返回tm结构体"<<endl; tm* curt2 = gmtime(&t); cout<<1900 + curt2->tm_year<<"年" <<1 + curt2->tm_mon<<"月" //该月份tm_mon范围为0~11 <<curt2->tm_mday<<"日"<<endl<<endl; cout<<"char* asctime(tm*)函数的使用,得到机器时间,可将tm结构体转换为char*字符串"<<endl; char* ct2= asctime(curt); //得到机器时间 cout<<ct2<<endl<<endl; cout<<"void tzset(void)函数的使用,用于得到时区"<<endl; tzset(); time(&t); cout<<asctime(localtime(&t))<<endl<<endl; cout<<"double difftime(time_t,time_t)函数的使用,得到两次机器时间差"<<endl; //delay(2000); //本来想用此函数延时,编译总是不通过,后来一查才知道此函数是TC下用的,要加doc.h头文件,但是codeblocks环境下好像没有该头文件,现在都用Sleep()函数延时。 //Sleep(2000); //等待2秒,头文件 windows.h,注意开头必须是大写 S getchar(); //等待用户时间,头文件 stdio.h time_t t2 = time(NULL); double cha_t = difftime(t2,t); //输出单位是秒 cout<<cha_t<<endl<<endl; return 0; }
输出结果截图:
3,"",str,3,""
View Code
2015.5.1 求二进制中1的个数
一个简便算法:
int Count(int n) { int count = 0; while (n) { n = n & (n-1); count++; } return count; }
Freecode : www.cnblogs.com/yym2013
相关文章推荐
- C++ 学习拾遗 —— 点滴记录C++学习过程中遇到的问题以及整理
- CentOs下安装Apache的过程记录以及遇到的问题
- 记录学习laravel框架过程中遇到的问题
- C++学习过程中的问题记录
- stm32f407 学习过程中时钟问题(整理记录)
- file_put_contents以及file_get_contents的用法与在使用过程中遇到的问题(PHP学习)
- Stream学习过程中遇到的一个问题记录
- 学习python过程遇到的问题与记录
- file_put_contents以及file_get_contents的用法与在使用过程中遇到的问题(PHP学习)
- 第一篇博文 完全用来记录自己学习过程中遇到的问题
- 记录自己学习心得以及工作中遇到问题的总结
- xlua学习过程遇到的问题,以后通了之后可能就不是问题了。但是还是有记录的必要。
- Ubuntu学习记录、遇到的问题以及解决办法
- ITK+VTK 混编学习过程中遇到的问题记录
- [项目过程中所遇到的各种问题记录]学习篇——对工作以来的学习过的开源项目进行总结—DiscuzNt
- 新开博客,督促自己在学习过程中遇到的问题或者好的想法都记录下来
- 从今天起,我要记录学习过程中遇到的所有问题
- 整理iOS工作学习过程中遇到的各种问题
- 记录一下:Unity5.5.1和Android 交互学习以及遇到的问题
- elasticsearch学习过程中遇到的问题以及处理方式(持续更新...)