2014-02-21 22 views
0

我想要使用getopt()程序,需要「e」或「d」選項來選擇加密或解密然後需要一個密鑰用於不管是在。我的問題是我不知道如何用getopt()來處理密鑰。我已經閱讀了許多關於getopt()的東西,以及其他許多文章。我目前得到一個浮點錯誤和核心轉儲,並收到警告消息:如何使用getopt()與非選項參數

cypher.c:在函數'main'中: cypher.c:14:3:warning:將參數2從'getopt'從不兼容的指針類型[默認啓用] /usr/include/getopt.h:152:12:note:expected'char * const *'but argument is of'char *' cypher.c:28:13 :警告:賦值使得指針中的整數沒有投射[默認啓用]

下面是實際的代碼,任何幫助表示讚賞。

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

main(int argc, char **argv[]){ 

    int e,x; 
    int i=0;  
    int c=fgetc(stdin); 
    // int n=strlen(key); 
    int encrypt; 

    while((x = getopt (argc, argv, "ed")) != -1){ 
    switch (x){ 
    case 'e': 
     encrypt=1; 
     break; 
    case 'd': 
     encrypt=0; 
     break; 
    default: 
     fputs("you broke it\n",stderr); 
     exit(1); 
    } 
    } 
    char key[100]; 
    key[100]= argv[optind++]; 
    int n = strlen(key); 

    if(encrypt == 1){ 
     while(c != EOF){ 
     c= fgetc(stdin); 
     e=(c - 32 + key[i % n]) % 95 +32; 
     fputc(e, stdout); 
     i++; 
     } 
    } 
    else{ 
     while(e != EOF){ 
     c = fgetc(stdin); 
     c=(e - 32 -key[i % n] +3 * 95) % 95 +32; 
     fputc(c, stdout); 
     i++; 
     } 
    } 
    exit (0); 
} 
+0

檢查'男子3 getopt' – hek2mgl

+0

@ hek2mgl,手冊頁吮吸,如果你是一個新人,所以downvoting,太爛太... – Oz123

+0

我在這裏沒有低估任何人。我認爲這個手冊頁確實有幫助,因爲它帶有例子和很好的解釋。它不*吸*,試試看。我也讀過它,很好。我已經明確地發佈了'man 3 ...',因爲我想表明只要輸入'man getopt'就可以給你shell程序的man頁面,這是一個不同的事情,並且行爲與C功能。快樂選項解析! :) – hek2mgl

回答

3

通常要單獨的選項處理分成兩個步驟:

  1. 收集所有選項,做任何預處理對它們(如檢查其有效性),並根據需要將它們存儲在變量或結構。
  2. 實際上是根據遇到的全部選項採取行動。

所以基本上你可能會想設置一個全局變量(類似於如0​​或opt_mode = DECRYPT或東西),以及存儲密鑰是必要的。然後在完成所有選項處理後,實際上根據opt_mode變量進行加密或解密。

+0

謝謝,這幾乎很有道理。你已經把我從無數個小時的頭撞牆上救了出來。 – CSnewb

0

Linux的大多數新手甚至不知道man,在windows中沒有man
另外,我的系統管理員可能沒有安裝該軟件包。如果你可以在你的機器上安裝軟件包,安裝軟件包:

sudo apt get install manpages-dev # on debian based systems 

這是一個有用的資源,你可以找到所有可能的人頁面的列表做:

dpkg -L manpages-dev 

,這裏是哪裏是什麼您正在尋找:

$ dpkg -L manpages-dev| grep getop 
/usr/share/man/man3/getopt.3.gz 
/usr/share/man/man3/getopt_long_only.3.gz 
/usr/share/man/man3/getopt_long.3.gz 

這裏是明文一個很好的例子,在除了到手冊頁(這往往簡潔)...

http://linuxprograms.wordpress.com/2012/06/22/c-getopt-example/

+0

是啊'人3 ...'真的很有幫助!初學者應該知道。好答案! – hek2mgl

+0

順便說一句:嘗試「apropos getopt」 – jeremycole

0

getopt(3)有一個很好的例子:

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

int 
main(int argc, char *argv[]) 
{ 
    int flags, opt; 
    int nsecs, tfnd; 

    nsecs = 0; 
    tfnd = 0; 
    flags = 0; 
    while ((opt = getopt(argc, argv, "nt:")) != -1) { 
     switch (opt) { 
     case 'n': 
      flags = 1; 
      break; 
     case 't': 
      nsecs = atoi(optarg); 
      tfnd = 1; 
      break; 
     default: /* '?' */ 
      fprintf(stderr, "Usage: %s [-t nsecs] [-n] name\n", 
        argv[0]); 
      exit(EXIT_FAILURE); 
     } 
    } 

    printf("flags=%d; tfnd=%d; optind=%d\n", flags, tfnd, optind); 

    if (optind >= argc) { 
     fprintf(stderr, "Expected argument after options\n"); 
     exit(EXIT_FAILURE); 
    } 

    printf("name argument = %s\n", argv[optind]); 

    /* Other code omitted */ 

    exit(EXIT_SUCCESS); 
}