Linux C程序命令行传参
? ? 在命令行環境下,執行已編譯的程序時,將命令行參數以同一行的附加參數的形式傳入到要執行的程序中。C編譯器允許main()函數沒有參數,或者有兩個參數(也有可能更多,是對標準的擴展)。一般形式為“int main(int argv;char* argv[])”,其中第一個參數argc代表命令行中字符串個數(系統以空格作為一個字符串結束的標志);第二個參數*argv[]是一個字符指針組成的數組或者是一個指向字符串的指針數組,命令行的每一個字符串被存儲到內存中,并且分配一個指針指向它,這些指針即構成第二個參數。
編寫一個程序:
#include<stdio.h>
#include<stdlib.h>
int main(int argc,char *argv[]){int i,times,count;if(argc < 2)printf("Note : %s should follow your name and a positive-number\n",argv[0]);else if(argc < 3 || (times = atoi(argv[2])) < 1)printf("Note : %s %s should follow a positive-number\n",argv[0],argv[1]);elseprintf("Implementation success!\n");for(i = 0; i < times; i++){printf("Hello, %s!\n",argv[1]);}return 0;
編譯并執行:
600*400
? ? 在這個簡單的程序中,雖然以數字作為命令行附加參數,但是程序執行時這些參數是以字符串的形式存儲的,因此用到了C標準庫函數atio(),它是以字符串作為參數,返回相應的整數值,即完成字符串到整數的轉換。需要注意的是,字符串若是以整數開頭,但整數之后跟有其他字符,atio()函數仍然可以正常返回之前讀取的整數值。但是字符串中不是以整數開頭(字符串中無整數以及字符串中有整數但不是位于開頭位置),函數則返回一個0。
? 接下來,我們利用命令行傳入參數的方法,進行文件操作實例。創建一個新的文件fupenzi.txt。代碼文件create_file.c如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>int main(int argc,char* argv[]){char name[40];FILE *new_file;strcpy(name,argv[1]); //拷貝傳入的第一個字符串到定義的數組中,限定傳入字符串長度為39,該字符串將作為文件名;new_file = fopen(name,"w"); //打開以命令行參數命名的文件并清空內容,若是不存在該文件則重新建立之;fclose(new_file);//關閉文件;return 0;
}
執行結果:
?
C程序中也經常需要命令行傳參,常見于Linux C/C++應用軟件,寫一個典型的命令行參數解析demo,對命令行的參數進行解析后執行相關操作。
#include <ctime>
#include <string>using namespace std;string inFile, outPath, fileName;
float fileSize;void soft_tag()
{time_t raw_time;struct tm *time_info;time(&raw_time);time_info = localtime(&raw_time);cout << "[Info]" << __DATE__ << __TIME__ << endl;cout << "[time]" << actime(time_info);
}void print_help_info()
{cout << "parameter description:" << endl;cout << "-i " << "input file." << endl;cout << "-o " << "output path of file." << endl;cout << "-m " << "name of file." << endl;cout << "-s " << "size of file." << endl;cout << "-h " << "print help info." << endl;
}int parse_cmd_args(int argc, char * argv[], int *para_in, int *para_out, int *para_main, int *para_size)
{enum para_state {PARA_NON, PARA_IN, PARA_OUT, PARA_MAIN, PARA_SIZE};int is_state = PARA_NON;for (int i = 1; i < argc; ++ i){string paraWord(argv[i]);int flg = 1;if (0 == paraWord.compare("-h")){print_help_info();exit(0);}if (0 == paraWord.compare("-m"))is_state = PARA_MAIN;else if (0 == paraWord.compare("-i"))is_state = PARA_IN;else if (0 == paraWord.compare("-o"))is_state = PARA_OUT;else if (0 == paraWord.compare("-s"))is_state = PARA_SIZE;elseflg = 0;if (flg) continue;switch(is_state){case PARA_IN :if (0 == access(argv[i], 0)){*para_in = 1;inFile.assign(argv[i]);}break;case PARA_OUT :*para_out = 1;outPath.assign(argv[i]);break;case PARA_MAIN :*para_main = 1;fileName.assign(argv[i]);break;case PARA_SIZE :*para_size = 1;fileSize = atof(argv[i]);break;default:break;}return 0;}int main(int argc, char *argv[])
{soft_tag();int para_in = 0, para_out = 0, para_main = 0, para_size = 0;parse_cmd_args(argc, argv, para_in, para_out, para_main);if (para_in)cout << "input file: " << inFile << endl;if (para_out)cout << "output path: " << outPath << endl;if (para_main)cout << "file name: " << fileName << endl;if (para_size)cout << "file size: " << fileSize << endl;return 0;
}
總結
以上是生活随笔為你收集整理的Linux C程序命令行传参的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 单纯想问一下各位朋友圈里抵制香港和抵制柴
- 下一篇: 涉及位操作的算法辑录