Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C编程getopt_long中,如何将转义序列(如tab和newline char)作为命令行参数传递?_C_Getopt_Getopt Long_Argc - Fatal编程技术网

在C编程getopt_long中,如何将转义序列(如tab和newline char)作为命令行参数传递?

在C编程getopt_long中,如何将转义序列(如tab和newline char)作为命令行参数传递?,c,getopt,getopt-long,argc,C,Getopt,Getopt Long,Argc,我几乎到了代码的末尾,在大量搜索之后,我没有找到解决方案no where,我想向我的程序提供转义序列,如“\t”、“\n”,如awk和perl程序所采用的方式,最后我想将它们用作printf或sprintf格式字符串 这就是我到目前为止所尝试的,请注意,我需要变量delim,rs应该是指针。 #include <stdio.h> #include <stdlib.h> #include <getopt.h> int main (int argc,

我几乎到了代码的末尾,在大量搜索之后,我没有找到解决方案no where,我想向我的程序提供转义序列,如“\t”、“\n”,如
awk
perl
程序所采用的方式,最后我想将它们用作printf或sprintf格式字符串

这就是我到目前为止所尝试的,请注意,我需要变量delim,rs应该是指针。

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


 int main (int argc, char **argv)
 {
   int c;

   char *delim = ",", *rs = "\n\r";

   while (1)
     {
       static struct option long_options[] =
         {

           {"delim",  required_argument, 0, 'd'},
           {"row_sep",  required_argument, 0, 'r'},
           {0, 0, 0, 0}
         };

       int option_index = 0;

       c = getopt_long (argc, argv, "df",
                        long_options, &option_index);


       if (c == -1)
         break;

       switch (c)
         {
         case 0:

           if (long_options[option_index].flag != 0)
             break;
           printf ("option %s", long_options[option_index].name);
           if (optarg)
             printf (" with arg %s", optarg);
           printf ("\n");
           break;

         case 'd':
           delim = optarg;
           break;

         case 'r':
           rs = optarg;
           break;

         case '?':
           break;

         default:
           abort ();
         }
     }


   /* Print any remaining command line arguments (not options). */
   if (optind < argc)
     {
       printf ("non-option ARGV-elements: ");
       while (optind < argc)
         printf ("%s ", argv[optind++]);
       putchar ('\n');
     }



 /* Test input argument */


 printf("This is test%ssome text%s",delim,rs);



   exit (0);
 }
我希望它打印制表符和换行符,而不是原始的“\t”和“\n”


请有人帮帮我。

某些地方的代码必须将反斜杠-t和反斜杠-n转换为制表符和换行符。您可以让shell执行此操作(如果它是Bash或支持):

或者使用
printf
命令(不同于
printf()
函数,但与之相关);这样可以避免使用任何Bashism:

./a.out --delim="$(printf '\t')"
./a.out --delim="$(printf '\t')" --row_sep="$(printf '\n')"
或者,实际上,您可以简单地在命令行中键入字符。进入选项卡需要键入Control-VControl-I以避免文件名完成

$ ./a.out --delim='^V^I'
$ ./a.out --delim='^V^I' --row_sep='
> '
不过,这一点不太清楚;我会优先使用前两种机制中的一种

或者你也可以在你的程序中这样做。这有点难,但不多。我有一个相当全面的函数,
cstrlit\u chr()
,它完成了大部分工作(它不处理Unicode转义,如
\u0123
\U00012345
),但它不是标准的,它在一个238行长的文件中,包含注释和测试代码,等等(函数中有100多行非空白、非注释的C代码,如果我想花时间的话,可以压缩一下),所以在这里添加它有点大


你能给我看一下同样的例子吗

记录接口的标题说明:

/* Convert C String Literal in (str..end] (excluding surrounding quotes) */
/* to string, returning length of string, or -1 if conversion error, or */
/* -2 if there is not enough room for the output */
extern int cstrlit_str(const char *str, const char *end, char *buffer, size_t buflen);
/* Convert C Character Literal in (str..end] (excluding surrounding quotes) */
/* to character, returning converted char or -1 if string is invalid. */
/* If non-null, eptr is set to first non-converted (or non-convertible) character */
extern int cstrlit_chr(const char *str, const char *end, char const ** const eptr);

/* Convert character to C Character Literal. */
/* buffer[0] = '\0' if there isn't enough room in buffer */
extern void chr_cstrlit(unsigned char c, char *buffer, size_t buflen);
/* Convert string to C String Literal */
extern void str_cstrlit(const char *str, char *buffer, size_t buflen);
因此,
cstrlit_chr()
是一组四个函数中的一个。但是,它很容易使用:

 const char *endptr;
 int c = cstrlit_char(argv[i], argv[i]+strlen(argv[i]), &endptr);
如果
argv[i]
包含反斜杠和
t
,则
c
将被分配
'\t'
的值(通常为control-i或9)。如果它包含反斜杠和
n
,则
c
将被分配
'\n'
的值(通常为control-J或10)


endptr
中的值告诉您下一个要解释的字符是什么。

某些地方的代码必须将反斜杠-t和反斜杠-n转换为制表符和换行符。您可以让shell执行此操作(如果它是Bash或支持):

或者使用
printf
命令(不同于
printf()
函数,但与之相关);这样可以避免使用任何bashism:

./a.out --delim="$(printf '\t')"
./a.out --delim="$(printf '\t')" --row_sep="$(printf '\n')"
或者,实际上,您可以简单地在命令行中键入字符。进入tab需要您键入Control-VControl-I以避免文件名完成

$ ./a.out --delim='^V^I'
$ ./a.out --delim='^V^I' --row_sep='
> '
不过,这还不太清楚;我会优先使用前两种机制中的一种

或者你可以在你的程序中做。这有点难,但不多。我有一个相当全面的函数,
cstrlit\u chr()
,它完成了大部分工作(它不处理Unicode转义,比如
\u0123
\U00012345
),但它不是标准的,它位于一个238行长的文件中,包含注释和测试代码,等等(函数中有100多行非空白、非注释的C代码,如果我想花时间在它上面的话,可以压缩一点),所以在这里添加它有点大


你能给我看一下同样的例子吗

记录接口的标题说明:

/* Convert C String Literal in (str..end] (excluding surrounding quotes) */
/* to string, returning length of string, or -1 if conversion error, or */
/* -2 if there is not enough room for the output */
extern int cstrlit_str(const char *str, const char *end, char *buffer, size_t buflen);
/* Convert C Character Literal in (str..end] (excluding surrounding quotes) */
/* to character, returning converted char or -1 if string is invalid. */
/* If non-null, eptr is set to first non-converted (or non-convertible) character */
extern int cstrlit_chr(const char *str, const char *end, char const ** const eptr);

/* Convert character to C Character Literal. */
/* buffer[0] = '\0' if there isn't enough room in buffer */
extern void chr_cstrlit(unsigned char c, char *buffer, size_t buflen);
/* Convert string to C String Literal */
extern void str_cstrlit(const char *str, char *buffer, size_t buflen);
因此,
cstrlit_chr()
是一组四个函数中的一个。但是,它很容易使用:

 const char *endptr;
 int c = cstrlit_char(argv[i], argv[i]+strlen(argv[i]), &endptr);
如果
argv[i]
包含反斜杠和
t
,则
c
将被分配
'\t'
的值(通常为control-i或9)。如果它包含反斜杠和
n
,则
c
将被分配
'\n'
的值(通常为control-J或10)


endptr
中的值告诉您下一个要解释的字符是什么。

可能创建另一个调用此字符的程序?可能创建另一个调用此字符的程序?谢谢,这是使用美元符号的,有没有其他不使用美元符号的解决方案?@user3637224:请参阅更新。
^V^I是在键盘上键入的control-V和control-I(您可以点击tab键而不用control-I)。您知道
awk
perl
如何处理这些没有美元符号的转义序列吗?它们包含的代码相当于my
cstrlit\u chr()
。如果您有时间,请给我看一下
cstrlit_chr()
相同的示例。谢谢,这是使用美元符号的,您有没有其他没有美元符号的解决方案?@user3637224:请参阅更新。命令行中的
^V^I
是在键盘上键入的control-V和control-I(您可以点击tab键而不是使用control-I)。您知道
awk
perl
如何处理这些没有美元符号的转义序列吗?它们包含相当于我的
cstrlit\u chr()
的代码。如果您有时间,请给我看一下
cstrlit\u chr()
相同的示例?