我正在尝试对一个程序使用getopt(),该程序需要一个“e”或“d”选项来选择encrypt或decrypt,然后需要一个密钥用于on。我的问题是我不知道如何使用getopt()处理密钥。在这一点上,我已经阅读了很多man getopt()的内容和许多其他文章。我当前收到一个浮点错误和核心转储,正在接收警告消息:
cypher.c:在函数“main”中:
cypher.c:14:3:警告:从不兼容的指针类型[enabled by default]传递“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 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);
 }

最佳答案

通常需要将选项处理分为两个步骤:
收集所有选项并对它们进行任何预处理(例如检查它们的有效性),并根据需要将它们存储在变量或结构中。
实际根据遇到的全部选项采取操作。
因此,基本上您可能需要设置一个全局变量(例如opt_mode = ENCRYPTopt_mode = DECRYPT或类似的变量),并根据需要存储密钥。然后,在完成所有选项处理之后,实际根据opt_mode变量进行加密或解密。

关于c - 如何将getopt()与非选项参数一起使用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21927309/

10-12 18:18