C语言 如何将 getopt() 与非选项参数一起使用



我正在尝试将getopt()用于需要"e"或"d"选项来选择加密或解密的程序,然后获取用于其中任何一个的密钥。 我的问题是我不确定如何使用getopt()处理密钥。 在这一点上,我已经阅读了很多关于 getopt() 的东西和许多其他文章。 我目前收到浮点错误和核心转储,并收到警告消息:

cypher.c:在函数"main"中:cypher.c:14:3:警告:从不兼容的指针类型传递"getopt"的参数 2 [默认启用]/usr/include/getopt.h:152:12:注意:预期的"char * const*",但参数的类型为"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 itn",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);
 }

通常,您希望将选项处理分为两个步骤:

  1. 收集所有选项并对其进行任何预处理(例如检查其有效性),并根据需要将它们存储在变量或结构中。
  2. 实际上根据遇到的全套选项采取行动。

所以基本上你可能想要设置一个全局变量(如opt_mode = ENCRYPTopt_mode = DECRYPT或类似的东西),并根据需要存储密钥。然后在完成所有选项处理后,实际上根据opt_mode变量进行加密或解密。

大多数新来者 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/

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] namen",
                    argv[0]);
            exit(EXIT_FAILURE);
        }
    }
   printf("flags=%d; tfnd=%d; optind=%dn", flags, tfnd, optind);
   if (optind >= argc) {
        fprintf(stderr, "Expected argument after optionsn");
        exit(EXIT_FAILURE);
    }
   printf("name argument = %sn", argv[optind]);
   /* Other code omitted */
   exit(EXIT_SUCCESS);
}

相关内容

  • 没有找到相关文章

最新更新