1. 程式人生 > >#Linux中的GCC程式設計# 第一次作業

#Linux中的GCC程式設計# 第一次作業

LSD 培訓作業

2017年8月17號

1、Demo1 帶參主函式,引數列印輸出

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>

void delay(int time)
{
	usleep(time*10000);
}
int main(int argc,char* argv[])
{
#if 1
	if(argc<2)
	{
		printf("缺少\n");
		return -1;
	}
	/*
	if(argc!=2)
	{
		char* p="引數不夠";
		fprintf(stderr,"%s\n",p);

		//或者		
		perror("引數不夠\n");
		return -1;
	}
	*/
	int i=0;
	while(argv[1][i])
	{
	    printf("%c ",argv[1][i]);
	    fflush(stdout);
	    delay(10);
	    i++;
	}
	printf("\n");
#else
	if(argc<2)
	{
		fprintf();
	}

#endif

	return 0;
}

/*
執行結果:
[email protected]
:/usr/Kshine/lsd/0817$ ./D1 Kshine Love China ! K s h i n e */

2、帶參主函式,傳入檔名,寫入我喜歡的數字23,再讀出數值

//標準IO庫函式
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

//系統io
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>

int main(int argc, char** argv)
{
	if(argc<2)
	{
		printf("輸入出錯\t");
		fprintf(stderr,"%s\n",strerror(errno));
		return 0;
	}

	int fd = open(argv[1],O_RDWR | O_TRUNC |O_CREAT ,0664);
	
	//-------------
	int value=23;
	if(write(fd,&value,sizeof(int))==-1)
	{
		printf("寫 出錯\t");
		fprintf(stderr,"%s\n",strerror(errno));
		return 0;
	}
	printf("write success!\n");
	//------------
	int value2=0;
	//lseek(fd,-2,SEEK_CUR);
	lseek(fd,0,SEEK_SET);
	printf("offset success!\n");
	if(read(fd,&value2,sizeof(int))==-1)
	{
		printf("讀錯誤\t");
		fprintf(stderr,"%s\n",strerror(errno));
		return 0;
	}
	printf("read success!\n");
	printf("the value is : %d\n",value2);	
	close(fd);
	return 0;
}


執行結果:
[email protected]
:/usr/Kshine/lsd/0817$ ./D2 Kshine Love China write success! offset success! read success! the value is : 23

3、作業1:帶參主函式,傳入IP和PORT的等式,並進行分解輸出

/*
2017年08月17日
第一題:
IP = 192.168.1.1
PORT = 8080
要求通過 系統IO 
分解出192.168.1.1存入 第一個字元陣列中,
分解出8080 存入第二個字元陣列中。
最後列印輸出。
*/

//標準庫
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
//系統庫
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>

int main(int argc,char* argv[])
{
	//程式執行命令,無後接的字串
	if(argc>=2)
	{
		printf("執行命令錯誤\n");
		//fprintf(stderr,"%s\n",strerror(errno));
		return 0;
	}

	//使用者輸入
	int i=0;
	char str1[30]="";
	char str2[30]="";
	printf("請輸入字串1\n");//行快取,\n重新整理輸出
	//scanf("%s%s",str1,str2);
	gets(str1);
	printf("請輸入字串2\n");
	gets(str2);
	//系統IO的操作----------------------------
	
	//1、開啟檔案
	//int open(const char *pathname, int flags, mode_t mode);
	int fd = open("hw1",O_RDWR | O_CREAT | O_TRUNC,0664); //通過檔案符開啟
	//許可權 S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH
	printf("open success!\n");//行快取 通過\n 重新整理輸出
	
	//2、寫入資料		
	if(write(fd,str1,sizeof(char)*30) == -1 || \
	   write(fd,str2,sizeof(char)*30) == -1 )
	{
		printf("寫出錯!\n");
		fprintf(stderr,"%s\n",strerror(errno));
		return 0;
	}
	printf("write success!\n");
	//3、偏移檔案操作指標的位置
	
	//lseek(fd,0,SEEK_SET);
	FILE* fp =fdopen(fd,"r+");
				//r+和w+都是讀寫,但是w+會清空已有檔案
	fseek(fp,0,SEEK_SET);
	//4、讀取資料
	#if 1
	i=0;
	char ch=0;
	int flag=0,count=0;//用於切換儲存的陣列
	for(;;)
	{
		//讀取單個字元
		if(read(fd,&ch,sizeof(char)) == 0 )
		{
			break;
		}
		
		if((ch <= '9'&& ch >= '0')|| ch== '.')//如果是數字或者.
		{
			if(ch == '.' && count>=0  )//記錄‘.’的個數
			{
				count++;
			}
			if(flag==0)//第一個字串儲存
			{
				str1[i]=ch;
				i++;
				continue;
			}
			if(flag >= 1)//1 第二個字元開始 2
			{
				flag=2;
				str2[i]=ch;
				i++;
				continue;
			}
			
			continue;
			
		}
		//已經經過3個. 到這裡還不是數字
		else if(count==3)
		{
			count=-10;//結束計數
			str1[i]='\0';
			flag=1;//切換到字串2
			i=0;		
		}
		
		if(flag==2)//已經在str2中寫了數字了,這裡不是數字,則埠的數值結束
		{
			str2[i]='\0';
			break;
		}
	}
	printf("read success!\n");
	#endif
	//5、關閉檔案
	close(fd);
	printf("close success!\n");

	//6、輸出
	printf("%s\n",str1);
	printf("%s\n",str2);
	return 0;
}


執行結果:

[email protected]
:/usr/Kshine/lsd/0817$ ./H1 請輸入字串1 Kshine 請輸入字串2 Love open success! write success! read success! close success! Kshine Love [email protected]:/usr/Kshine/lsd/0817$ ./H1 請輸入字串1 ip = 192.168.1.1 請輸入字串2 port = 8080 open success! write success! read success! close success! 192.168.1.1 8080

4、帶參主函式,實現拷貝copy功能

/*
2017年08月17日
第二題
利用系統IO函式 
實現 cp 功能,
要求檔名1,
檔名2 
從main函式傳入。
*/

//標準庫
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
//系統庫
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>

int main(int argc,char* argv[])
{
        //程式執行命令
        if(argc<3)
        {
                printf("執行引數不夠\n");
                //fprintf(stderr,"%s\n",strerror(errno));
                return 0;
        }

        
        //系統IO的操作---------------------------------------

	//1、開啟檔案
        //int open(const char *pathname, int flags, mode_t mode);

	int fd1 = open(argv[1],O_RDONLY,0664);//檔案1,開啟 讀取 
	printf("open file1 success!\n");
	
        int fd2 = open(argv[2],O_WRONLY | O_CREAT | O_TRUNC,0664); //通過檔案符開啟

        //許可權 S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH
        printf("open file2 success!\n");//行快取 通過\n 重新整理輸出
                

	
	//2、單字元搬運
	char ch=0;
	while(1)
	{
		//讀取單個字元
                if(read(fd1,&ch,sizeof(char)) == 0 )
                {
                        break;
                }
		write(fd2,&ch,sizeof(char));
	}

        printf("copy complete!\n");
	
	//3、關閉
	close(fd1);
	close(fd2);
        
        return 0;
}


執行結果:
[email protected]:/usr/Kshine/lsd/0817$ gcc homework2.c -o H2 -Wall
[email protected]:/usr/Kshine/lsd/0817$ ./H2 text newText
open file1 success!
open file2 success!
copy complete!


5、帶參主函式,傳入檔名,將九九乘法表的列印輸出 重定向 到該檔案中。

/*
2017年08月17日
第三題
通過重定向FILE *freopen(const char *path, const char *mode, FILE *stream);
把99乘法表列印輸出到檔案,
輸出完成後復原重定向
在螢幕上列印write OK
*/

//標準IO庫函式
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

//系統io
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>

int main(int argc ,char** argv)
{
	if(argc!=2)
	{
		fprintf(stderr,"命令引數個數錯誤\n");
		return 0;
	}
	//int creat(const char *pathname, mode_t mode);
	//建立檔案
	int fd=creat(argv[1],0664);
	#if 1
	//重定向
	if(freopen(argv[1],"w",stdout)==NULL)
	{
		printf("重定向失敗\n");
		return 0;
	}	
	#endif
	#if 0
	/* 重定向 */  
        if (-1 == dup2(fd,STDOUT_FILENO) ) {  
                printf("can't redirect fd error\n");  
                exit(1);  
        }  
	#endif

	//輸出
	int i=1,j=1;
	printf("九九乘法表:\n");
	for(i=1;i<=9;i++)
	{
		for(j=1;j<=9;j++)
		{
			printf("%dx%d=%d\t",i,j,i*j);
		}
		printf("\n");
	}
	
	//還原重定向
	#if 1
	if(freopen("/dev/tty","w",stdout)==NULL)
        {
                printf("重定向失敗\n");
                return 0;
        }

	#endif
	#if 0
	/* 恢復stdout */  
        if (-1 != dup2(fd,STDOUT_FILENO) ) {  
                printf("recover fd ok \n");  
  
                /* 恢復後,寫入stdout應該向螢幕輸出 */  
                write(STDOUT_FILENO,"stdout\n",7);  
        }  
	#endif

	//再次輸出
	printf("write ok \n");
	//關閉
	close(fd);

	return 0;
}

[email protected]:/usr/Kshine/lsd/0817$ gcc homework3.c -o H3 -Wall
[email protected]:/usr/Kshine/lsd/0817$ ./H3 KKK3
write ok 

[email protected]:/usr/Kshine/lsd/0817$ cat KKK3 
九九乘法表:
1x1=1	1x2=2	1x3=3	1x4=4	1x5=5	1x6=6	1x7=7	1x8=8	1x9=9	
2x1=2	2x2=4	2x3=6	2x4=8	2x5=10	2x6=12	2x7=14	2x8=16	2x9=18	
3x1=3	3x2=6	3x3=9	3x4=12	3x5=15	3x6=18	3x7=21	3x8=24	3x9=27	
4x1=4	4x2=8	4x3=12	4x4=16	4x5=20	4x6=24	4x7=28	4x8=32	4x9=36	
5x1=5	5x2=10	5x3=15	5x4=20	5x5=25	5x6=30	5x7=35	5x8=40	5x9=45	
6x1=6	6x2=12	6x3=18	6x4=24	6x5=30	6x6=36	6x7=42	6x8=48	6x9=54	
7x1=7	7x2=14	7x3=21	7x4=28	7x5=35	7x6=42	7x7=49	7x8=56	7x9=63	
8x1=8	8x2=16	8x3=24	8x4=32	8x5=40	8x6=48	8x7=56	8x8=64	8x9=72	
9x1=9	9x2=18	9x3=27	9x4=36	9x5=45	9x6=54	9x7=63	9x8=72	9x9=81