实验二
操作系统实验报告——实验二:C编程环境
实验目的
1. 熟悉Linux下C程序设计的环境; 2. 对系统调用有初步了解。
实验内容
1.Linux下C语言程序的开发过程 a、在用户主目录下用vi编辑C语言源程序(源程序已附后),如:$vi hello.c。 b、用gcc编译C语言源程序:$gcc ./hello.c -o example 这里gcc是Linux下的C语言程序编译器(GNU C Compiler),./hello.c表示待编译的源文件是当前工作目录下的hello.c,-o example表示编译后产生的目标代码文件名为example。
c、若编译不正确,则进入vi修改源程序,否则,运行目标代码:$./example 。 注意:
这只是gcc最基本的用法,其他常用选项有:-c , -S , -O , -O2, -g 等。
2.编辑、调试下面c语言程序,说明该程序的功能。 #include
int n,a[200],carry,temp,i,j,digit = 1; printf(\ scanf(\ a[0] = 1;
for( i = 2; i <= n; ++i) {
for( j = 1, carry = 0; j <= digit; ++j) { temp = a[j-1] * i + carry; a[j-1] = temp % 10; carry = temp / 10; }
while(carry) {
a[++digit-1] = carry % 10; carry /= 10; } }
printf(\ for( i = digit; i >=1; --i) { printf(\ }
1
实验二
printf(\ return 0; }
程序运行结果截图:
程序实现功能:
计算非负数的阶乘,阶乘运算的结果的个位十位百位……分别保存在a[0],a[1],a[2]……
3.编写命令解释程序 (1)内容:
利用C语言编写一个微型命令解释程序,接受并解释以下命令:
1.dir //列当前目录 2.cop 文件1 文件2 //拷贝文件 3.era文件名 //删除文件 4.dis字符串 //显示字符串 5.end //结束,退出 (2)要求:
1.命令应该由空格隔开;
2.进行命令合法性检查,若不合法,显示出错信息,等待重新输入; 3.调用shell命令来完成各项功能。 (3)思路:
2
实验二
1.用指针数组形式定义命令保留字表和shell命令字表。 静态数组形式如下:
char *cwt[ ]={\ //命令保留字表 char *scwt[ ]={\//shell命令字表 2.输入命令字fgets(string,buff_size,stdin); 3.分离命令字strcspn(); 4.比较命令字strcmp();
5.执行shell命令:使用系统调用system()。
程序实现源代码:
//非纯原创,代码略有借鉴 #include
//分离命令保留字及其后面部分
void apart(char input[],char cmpstr[],char output[]) { char tmp[30]=\ int i=0,j=0,n,m=0;
for(;i //分离命令: strcspn返回tmp中第一次为空格的位置,所以命令后面必须有空格 for(n=0;n //分离命令后面部分保留至output字符数组 for(n=strcspn(tmp,\ output[m]=tmp[n]; m++; } } int main() { char *cwt[ ]={\ //命令保留字表 char *scwt[ ]={\//shell命令字表 char input[30]=\ //存放输入串 char cmpstr[30]=\ //存放分离后的命令保留字 char output[30]=\ //存放命名保留字后面部分 char shellstr[30]=\ printf(\ printf(\ printf(\ ||cop file1 file2-\\n\ printf(\ ||era filename -\\n\ printf(\ ||dis string -\\n\ printf(\ ||end -\\n\ 3 实验二 printf(\ int i,j; while(1){ i=0; printf(\ fgets(input,30,stdin); //fgets(s,buff_size,stdin) //从键盘读入一串字符,包括空白等符号在内。读入到字符数组 s 里 apart(input,cmpstr,output); //比较字符串str1和str2是否相同。如果相同则返回0; while(strcmp(cmpstr,cwt[i])!=0&&(i<=4)) i++; //i等于4,执行end,退出程序 if(i==4) { strcpy(shellstr,scwt[i]); strcat(shellstr,output);//字符串连接函数 system(shellstr); break; } //i<4,执行其他命令 else if(i<4){ strcpy(shellstr,scwt[i]); strcat(shellstr,output); system(shellstr); //执行shell命令 } else printf(\ //清空字符串,为下一次输入准备 for(j=0;j<=30;j++) { input[j]='\\0'; cmpstr[j]='\\0'; output[j]='\\0'; shellstr[j]='\\0'; } } return 0; } 程序运行结果截图: 4 实验二 5 实验二 6