Tags: C/C++

1.stdfax.h

当我们使用AppWizard来自动生成某些项目的时候,系统会自动把所需要include的头文件在stdafx.h中先include一下,这样,我们只需要直接include这个stdafx.h文件即可。因为同一个项目中的不同源文件CPP都包含相同的include文件,为每个.CPP文件都重复include这些文件就显得很傻了。即:在每个.cpp文件中都include stdafx.h 就相当于包含了其他的如iostream.h等文件,可以起到简化include的作用。

2.程序的启动参数

在默认情况下,C语言一个空的main函数应该是如下的样子:

void main()
{
	//Your codes...
}

在C++中有一些变化,默认新建出的main函数如下:

int main(int argc , char * argv[])
{
	Your codes...
	return 0;
}

在C++中main函数默认是有返回值的而不再是void,当然也可以修改成void。其次默认main函数多了两个参数,我们同样可以选择不管它或直接删掉,变成C语言默认的样子。但这里要说的就是这两个参数。
这两个参数叫做程序的“启动参数”,简而言之就是通过在命令行中输入不同的参数,可以做到有条件地启动程序。argc是命令行总的参数个数,argv[]是argc个参数,其中第0个参数是程序的全名(包含文件绝对路径),后面的跟的是用户输入的其它参数。argc记录了用户在运行程序的命令行中输入的参数的个数。argv[]指向的数组中至少有一个字符指针,即argv[0].他通常指向程序中的可执行文件的文件名。在有些版本的编译器中还包括程序文件所在的路径。各参数用一个空格隔开。例如main函数的代码如下:

int main(int argc,char * argv[])
{
	for (int i = 0; i < argc; i++)
	{
		printf("%s\n", argv[i]);
	}
	system("pause");
	return 0;
}

控制台输入参数即输出如下图所示:
result

3.C&C++中的string

C++

要想使用标准C++中string类,必须要包含#include 。注意是,不是,带.h的是C语言中的头文件,或者using namespace std;。

String的构造

string(const char *s); //用c字符串s初始化
string(int n,char c); //用n个字符c初始化
此外,string类还支持默认构造函数和复制构造函数,如string s1;string s2=”hello”都是正确的写法。当构造的string太长而无法表达时会抛出length_error异常。

String的比较

可以直接利用“==”判断是否相等,或利用compare函数即可对两个字符串进行比较。函数原型是:

int compare(const string &s)

若两个字符串内容相等,则返回0,若s1大于s2,则返回为正,否则返回为负。这里的大小是指两个字符串对应位置上字符的ASC码的比较,并不是指长度,这需要注意。如果想比较长度,可以对两个字符串的length属性进行比较。因此compare更适合于判断两个字符串内容是否相同。测试代码如下,最后输出结果为“s1=s2”。

string s1 = "string";
string s2 = "string";
int result = s1.compare(s2);
if (result > 0)
	printf("s1>s2\n");
else if (result < 0)
	printf("s1<s2\n");
else
	printf("s1=s2\n");
String的输出

对于C++中string的输出,可以直接使用cout函数完成,如下代码:

string test = "testString";
cout << test << endl;

C

String的初始化和构造

在C语言中,将字符串作为字符数组来处理(C++中不是)。在程序中往往依靠检测’\0’的位置来判定字符串是否结束,而不是根据数组的长度来决定字符串长度。当然,在定义字符数组时应估计实际字符串长度,保证数组长度始终大于字符串实际长度。(在实际字符串定义中,常常并不指定数组长度,如char str[ ])对于字符数组初始化可以由如下方式:

char str[ ]={"I am happy"};
char str[ ]="I am happy";

注意:上述这种字符数组的整体赋值只能在字符数组初始化时使用,不能用于字符数组的赋值,字符数组的赋值只能对其元素一一赋值,下面的赋值方法是错误的:

char str[ ];
str="I am happy";

不是用单个字符作为初值,而是用一个字符串(注意:字符串的两端是用双引号“”而不是单引号‘’括起来的)作为初值。显然,这种方法更直观方便。(注意:数组str 的长度不是10,而是11,这点请务必记住,因为字符串常量”I am happy”的最后由系统自动加上一个’\0’)因此,上面的初始化与下面的初始化等价:

char str[ ]={'I',' ','a','m',' ','h','a','p','p','y','\0'};

而不是与下面的等价:

char str[ ]={'I',' ','a','m',' ','h','a','p','p','y'};

前者的长度是11,后者的长度是10.字符数组并不要求它的最后一个字符为’\0’,甚至可以不包含’\0’。

String的表示形式

在C语言中,有两种方法表示和存放字符串:
(1)用字符数组存放一个字符串,如:

char str[ ]="I love China";

(2)用字符指针指向一个字符串,如:

char* str="I love China";

对于第二种表示方法,有人认为str 是一个字符串变量,以为定义时把字符串常量”I love China”直接赋给该字符串变量,这是不对的。C 语言对字符串常量是按字符数组处理的,在内存中开辟了一个字符数组用来存放字符串常量,程序在定义字符串指针变量str 时只是把字符串首地址(即存放字符串的字符数组的首地址)赋给str。

String的输出

在C语言中,可以通过printf("%s",char * string)来对某一个char类型指针指向的string内容进行输出。%s 表示输出一个字符串,给出字符指针变量名str(对于第一种表示方法,字符数组名即是字符数组的首地址,与第二种中的指针意义是一致的),则系统先输出它所指向的一个字符数据,然后自动使str 自动加1,使之指向下一个字符…,如此,直到遇到字符串结束标识符” \0 “。如下代码:

char str[] = "testString";
printf("%s\n", str);

但需要注意的是,在C++中,并不能使用printf来输出string类型的字符串。printf输出字符串是针对char *的,换言之,printf只能输出C语言中的内置数据,string不是c语言内置数据。string类型的对象并非单单只有字符串,其内还有许多用于操作的函数,于是&s并非字符串的首地址,而是s这个对象的首地址。所以string对象提供了c_str()函数,用于将C++类型的string转换成C语言能够识别的字符串类型。

string s = "中国";
printf("%s" , s.c_str());//string中c_str()成员方法返回当前字符串的首字符地址
cout<<s;//string中重载了“<<”操作符

本文作者原创,未经许可不得转载,谢谢配合

返回顶部