如何在没有预定义字符的情况下接受用户输入并设置结构值?

我有一个主要功能:

int main(int argc,char *argv[]) {
    UserOptions opt;
    opt = GetDefaultOptions();
    /* Override defaults with requested options */
    HandleArgs(&opt,&argc,&argv);
}

名为UserOptions的结构:

typedef struct {
   int codewords;
   int mode; 
   char *separator;
} UserOptions;

GetDefaultOptions()将一些默认值设置为UserOptions,除非用户明确提供了这些默认值,在这种情况下,HandleArgs()对其进行了如下设置:

HandleArgs(UserOptions *opt,int *argcp,char **argvp[]) {
    int optchr;
    int longIndex;
    struct option longOptions[] = {
        {"codewords",required_argument,NULL,'c'},{"mode",no_argument,'D'},{"separator",' /* Something here */ '},{0,0}
    };

    for (;;) {
        optchr = getopt_long(*argcp,*argvp,"c:D: /* ??? */ ",longOptions,&longIndex);
        switch (optchr) {
            case 'c':
                opt->codewords = DmtxTrue;
                break;
             case 'D':
                opt->mode = 1;
                break;
             /* something to set opt->separator to user defined separator */
             default:
                return 0;
                break;
         }
    }
}

我想将分隔符设置为用户定义的值,而不是像\n这样的预定义值。例如,如果用户输入|>作为分隔符,则opt->separator应设置为|>

编辑: 我想在功能中使用用户提供的分隔符。现在我就像

if (tempBuffer[i] != '\n') {
    /* Do something */
}

相反,我想拥有它:

if (tempBuffer[i] != opt->separator) {
    /* Do something */
}

其中opt->分隔符可以是用户提供的|>

ainifang7875 回答:如何在没有预定义字符的情况下接受用户输入并设置结构值?

我假设

opt->分隔符将在调用HandleArgs之前设置。所以:

HandleArgs(UserOptions *opt,int *argcp,char **argvp[]) {
    int optchr;
    int longIndex;
    struct option longOptions[] = {
        {"codewords",required_argument,NULL,'c'},{"mode",no_argument,'D'},{"separator",*opt->separator},{0,0}
    };

在这一点上,我将根据结构的内容动态创建选项字符串,如下所示:(注意:您没有给出选项结构的定义,所以要对其进行补充)

char getopt_string[SOME_MAX_SIZE]="";
for (struct options* o=longOptions;o->first_field != NULL; o++)
{
   strncat(getopt_string,&o->forth_field,1);
   strcat(getopt_string,":");
}

然后像往常一样循环:

for (;;) {
    optchr = getopt_long(*argcp,*argvp,getopt_string,longOptions,&longIndex);
}

现在有一些断开连接,因为在switch语句中有明确的值,用于从longOptions动态创建的值。您可以在表中具有许多功能指针以使其完全动态(例如,将功能指针添加到options结构)

您不能动态更改大小写值,因此需要在默认部分处理分隔符:

switch (optchr) {
    ...
    default:
       if (optchr == opt->separator) 
           return DmtxSeparator;  // ?? :)

       return DmtxFail;
       break;
}
本文链接:https://www.f2er.com/3157854.html

大家都在问