我几乎到达了我的代码的末尾,经过大量的搜索我没有找到解决方案没有在哪里,我想提供转义序列,如'\ t','\ n'到我的程序,如{{1} }和awk
程序需要,最后我想将它们用作printf或sprintf格式字符串
这是我到目前为止所尝试的,请注意我需要变量delim,rs应该是指针。
perl
当我编译并执行时,我得到像这样的输出
#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'作为原始
请有人帮助我。
答案 0 :(得分:4)
某些代码必须将反斜杠-t和反斜杠-n转换为制表符和换行符。你可以让shell执行它(如果它是Bash或支持ANSI C quoting):
./a.out --delim=$'\t'
./a.out --delim=$'\t' --row_sep=$'\n'
或者使用printf
命令(与printf()
函数不同但与之相关);这可以避免使用任何Bashisms:
./a.out --delim="$(printf '\t')"
./a.out --delim="$(printf '\t')" --row_sep="$(printf '\n')"
或者,实际上,您只需在命令行键入字符即可。输入选项卡需要您键入 Control-V Control-I 以避免文件名完成。
$ ./a.out --delim='^V^I'
$ ./a.out --delim='^V^I' --row_sep='
> '
但这不太清楚;我首先使用前两种机制中的一种。
或者你可以在你的程序中完成它。这有点困难,但并不多。我有一个相当全面的函数,cstrlit_chr()
执行大部分工作(它不处理像\u0123
或\U00012345
这样的Unicode转义,但它不是标准的,它在一个238行长的文件,带有注释和测试代码等(函数中只有100多个非空白,非注释的C代码行,如果我想花时间在它上面就可以压缩一下),所以在这里添加它有点大。
您可以向我展示
cstrlit_chr()
示例吗?
记录界面的标题说:
/* 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
中的值告诉您要解释的下一个字符是什么。