您的位置:首页 > 编程语言 > C语言/C++

如何创建一个完整的C语言程序心得

2016-02-10 13:45 239 查看
首先说明一下,虽然题目逼格比较高,但是其实自己学的还是很不到位,所以只能把自己学到的东西简单写下来共大家改正。

首先初学c语言,一般创建的都是一个.c的文件,然后用编译器gcc之类的直接编译等,最后运行看结果。下面我写一个简单的程序说明如何写一个相对完整的c语言程序。

[code]/*
程序的作用是从字符串中查找指定的子字符串个数,输入输出都采用自定义数据流
*/
#include<stdio.h>
/*#include说明函数要包括头文件stdio.h,这个是用绝对路径查找的,由于系统环境变量PATH中包括了这个文件的位置,所以可以这么写。*/
int main()
{ 
FILE *infile=fopen("primitive_data","r");
FILE*outfile_data_one=fopen("organzised_data_one","w");
char str1[50];
fscanf(infile,"%s",str1);
fprintf(outfile_data_one,"%i\n",str_str(str1,"eo"));
/*这里str_str()函数是我自己写的一个,函数的作用是找出是str1字符串之中有多少个“eo”,这样的子字符串出现,返回出现的个数,具体的函数我后面再写,先假设写好了
*/
fclose(infile);
fclose(outfile_data_one);
}


上面的程序虽然不完整,但是说明我们已经写了一个.c的文件。

小插曲:很多时候我们把自己写的函数放到main()函数后面,这样如果在前面不加一个函数声明,就会报错,这是因为编译器在main函数中看到这个函数时,编译器会先记下这个函数,但是会默认这个函数的返回值为int,当编译器真正看到函数时,发现这个函数和自己之前假设的函数返回值不一样,确是同名,这样就有问题了,所以我们要采用函数声明来告诉编译器这个函数的返回值是什么。

下面我就创建了一个.h的头文件叫做str_str.h,

里面写着

[code]int str_str(char* ,char*);


补充在主函数中写下:

[code]#include"str_str.h"
//采用双引号为相对路径,这就要求你写文件和主文件在同一文件夹下。


现在我们要写str_str()函数的具体形式了

(再罗嗦几句,我们通常把一个.c的文件先编译成汇编语言的形式,再汇编成二进制目标文件,再链接所有的目标文件生成最后程序。)

[code]#include"str_str.h"
#include<string.h>
int str_str(char *str1,char *str2)
{
  int count=0;
  char *buff=NULL;
  while(strstr(str1,str2)!=NULL)
   {
     count++;
     buff=strstr(str1,str2); 
     strcpy(str1,buff+1);
   }
  return count;
}
/*strstr()函数和strcpy()函数是string.h里申明的函数,
strstr(char *str1,char *str2)的作用是在str1中查找str2字串,如果有返回其在str1中的位置指针。
*/


把上面的文件保存在叫做str_str.c的文件中,这样我们创建了三个文件

c_learning.c(主函数) str_str.h(函数声明) str_str.c(函数定义)

下面采用makefile的形式进行编译等,这样做的好处是一旦个别文件修改,不用手动重新编译等操作,还是在同一个文件夹下创建文件

makefile(名字貌似不要改别的)

里面的内容如下

[code]c_learning.o(目标文件): c_learning.c str_str.c str_str.h(所需文件)
    gcc -c c_learning.c(生成方法)
//gcc前面是tab键
str_str.o: str_str.c str_str.h
    gcc -c str_str.c
c_learning: str_str.o c_learning.o
    gcc str_str.o c_learning.o -o c_learning


结束后,在linux的bash下运行make c_learning即可

总结一下,我们运用将主函数写在一个文件中,其余函数写在别的文件之中,并且自己写了一个头文件用于放置自己写的所有函数声明,并且使用了make方法节约时间,最终实现程序。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: