面向c++程序员的C入门

C是Unix系统上系统开发的官方语言。在本课程中,我们将使用C语言完成几乎赢博体育的作业。

你们都在CMSC 270和CMSC 510上有c++的经验。c++是C语言的超集,并与C语言共享许多特性,包括if-else语句、循环、数组和指针。

因为c++语言用更现代的等价物取代了C语言中的许多关键特性,所以您必须学习的主要内容是c++所取代的那些原始C语言特性。本文档将作为对这些特性的介绍。

没有法律或法律

c++使用方便的cout和cin构造,结合流插入和提取操作符< <和> >来进行输入和输出。C使用C标准输入/输出库中的函数。

要使用C中的任何标准输入/输出函数,你需要使用下面的#include语句:

# include < stdio . h >

为了打印到标准输出,C使用printf函数。

Int number = 2;Printf ("1 + 1 = %d\n",number);

Printf表示“格式化打印”。这个函数接受一个或多个参数。第一个参数总是一个文本字符串,其中可能包含输出占位符。这个示例的格式字符串包含一个占位符%d,它是单个十进制整数值的占位符。printf中的格式字符串后面是一个以逗号分隔的值列表。这些值将用于在打印时按照从左到右的顺序替换格式字符串中的占位符。在本例中,我们使用存储在number变量中的值来替换%d占位符。

还要注意格式字符串末尾的换行字符\n。这告诉printf在其输出的末尾发出一个换行符,以便出现的任何进一步的输出将出现在我们刚刚打印的内容之后的下一行。

下面是与printf一起使用的最常见格式代码的表格。

代码 打印的内容
% d 整数
% f 浮点数为十进制数
% e 科学记数法中的浮点数
%如果 双精度十进制数
% s 字符串

这里有更多关于C格式代码的详细文档。

C使用scanf函数从控制台读取输入。

浮动h;scanf (% f、h);

Scanf类似于printf,因为它的第一个参数是包含一个或多个占位符的格式字符串。占位符告诉scanf应该从用户那里读取多少项以及它们的类型。在本例中,我们希望从用户那里读取单个浮点数,因此我们使用格式字符串“%f”。在格式字符串之后,有一个包含一个或多个指向变量的指针的列表,我们希望将输入读入这些变量。在这个例子中,我们使用寻址操作符&来获取一个指向我们想要读入的变量的指针。

为了从文件中打印或读取文本输入,C使用fprintf和fscanf来代替printf和scanf。

下面的示例是一个程序,它打开一个名为“data.txt”的文本文件,其中包含一个整数列表,读取这些整数,并计算它们的和。

#include <stdio.h> int main (int argc, const char * argv[]) {FILE *input;Int term, sum;Sum = 0;//以读模式打开输入文件。Input = fopen("data.txt","r");//读取输入直到到达文件末尾while(! fof (input)) {fscanf(input,"%d",&term);Sum = Sum + term;} //关闭输入文件fclose(input);printf(“数字的和是%d.\n”,sum);返回0;}

下面是第二个示例,它生成伪随机数序列并将其保存到输出文件中。

#include <stdio.h> int main (int argc, const char * argv[]) {FILE *output;Int x, n;//启动序列的种子值x = 152;//以写模式打开输出文件output = fopen("random.txt","w");为(n = 0; n < 1000; n + +) {x = (17389 * x + 12553) % 11657;//生成序列中的下一个数字fprintf(output,"%d\n",x%10);}文件关闭(输出);printf("完成。\ n”);返回0;}

C字符串

c++提供了方便的字符串类来帮助你处理程序中的文本。C没有类,因此C程序将文本存储为以空结尾的字符数组,并使用指向这些字符数组的指针。

这里有一些基本的例子。要在程序中使用预设的文本块,您可以简单地获得指向文本文本的指针。

const char* greeting = "Hello, World!";

要读取用户键入的文本,您必须设置一个字符数组来保存文本,然后使用scanf读取用户键入的文本。

字符缓冲区[64];scanf(“% s”,缓冲);

在上面的例子中,我们设置了一个大小为64的数组来接收用户输入的文本。该数组的空间可容纳63个字符加上标记文本结束的“\0”字符。如果用户键入超过63个字符,scanf将写入缓冲区数组的末尾。这就是所谓的缓冲区溢出,可能会导致程序崩溃或产生不正确的结果。

C标准库包含许多用于处理文本字符串的函数。赢博体育这些函数都可以通过#include语句使用

# include < string.h >

下面是一些比较有用的字符串函数的列表。在这些函数使用指向char的指针的每一种情况下,该指针实际上都指向一个字符数组。

函数 它是做什么的
Strcpy (char* dest,char* source) 将字符串从源复制到目标
strlen (char * str) 返回字符串str的长度
Strcmp (char* 1,char* 2) 比较1和2的字母顺序

strcmp函数比较两个字符串数组one和two,如果按字母顺序1在2之前返回-1,如果两个字符串相同则返回0,如果按字母顺序1在2之后返回1。(使用此函数时要小心:在ASCII编码系统中,赢博体育大写字母都位于小写字母之前,因此“Zebra”在字母顺序上位于“apple”之前。)

这里有更多关于C字符串函数的详细文档。

不添加或删除

c++使用new和delete操作符来创建对象和数组。创建100个int型数组的典型c++代码是这样的

int* A = new int[100];

C语言既没有new操作符,也没有delete操作符。相反,C使用一对库函数malloc()和free()来动态分配和释放内存。要使用这些库函数中的任何一个,你必须以适当的#include语句开始:

# include < stdlib.h >

malloc()函数的唯一参数是要创建的内存块的大小(以字节为单位)。要确定任何内置类型的大小,可以使用sizeof()操作。例如,要分配一个包含100个整型数的数组,我们可以这样做

int* A = (int*) malloc(100*sizeof(int));

由于malloc()返回void*类型的泛型指针,我们必须将malloc的结果类型转换为我们想要的指针类型。

要删除用malloc()分配的内存,可以使用free():

自由(A);

结构体

c++是一种面向对象的语言,大量使用类构造。C不是面向对象的,所以你不能在C程序中使用类。

C语言确实包含一个结构结构。结构本质上是一个只有成员变量而没有方法的类。

这里有一个典型的例子。假设我们想为有用的vector 类构造一个C等效类。我们的起点是一个定义intVector结构体的结构体定义:

struct intVector {int* items;int大小;int能力;};

C结构体本质上是一个成员变量列表。

c++区分了公有成员变量和私有成员变量。在C结构体中,赢博体育成员都自动为public。

你可以通过直接声明一个结构类型变量或使用malloc()创建一个指向结构的指针来创建一个结构的实例:

struct intVector;struct intVector* B = (struct intVector*) malloc(sizeof(struct intVector));

可以通过熟悉的方法访问结构体的成员。和->操作符:

a .容量= 8;A.items = (int*) malloc(A.capacity*sizeof(int));A.size = 0;B->容量= 16;B-> = (int*) malloc(B->容量*sizeof(int));B->size = 0;

声明结构类型的另一种方法是使用类型定义构造。

struct {int* items;int大小;int能力;} intVector;

这种方法的主要优点是,当您使用以这种方式定义的结构时,不必到处使用struct关键字。例如,上面的代码变成

intVector;intVector* B = (intVector*) malloc(sizeof(intVector));

这样更快捷,更容易输入。

在类中的方法中,C程序员通常使用指向要操作的结构体的指针作为参数来编写函数。

下面是创建和初始化intVector的另一种方法。

intVector* makeIntVector(int capacity) {intVector* V = (intVector*) malloc(sizeof(intVector));V->capacity =容量;= (int*) malloc(capacity*sizeof(int));V->size = 0;返回V;}

下面是在vector对象上定义push_back操作的方法。

void push_back(intVector* V,int x) {if(V->size == V->capacity) {int* newItems = (int*) malloc(V->capacity*2*sizeof(int));int n;(n = 0; n < V - >大小;n + +) newItems [n] [n] = V - >项目;自由(V - >项目);V->items = newItems;V->容量= V->容量*2;} V->items[V->size] = x;V - >大小+ +;}

为了代替析构函数,我们必须定义一个函数来释放intVector及其包含的数组。

void destroy(intVector* V) {free(V->项);自由(V);}

无参考参数

c++引入了方便的引用参数。C没有引用参数。如果你想通过引用传递一个项目,你必须传递一个指向该项目的指针。