2014-02-21 28 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); 
}