如何使用Perl将任意字符串转换为有效的,可读的 C字符串文字(即可以放入C源并由C编译器理解的东西)?
仅需要核心模块的解决方案的奖励点。
#!/usr/bin/perl
use strict;
use warnings;
my $str = get_some_string(); # Read string from file, database, network etc
my $cstr = ???($str);
print "const char *str = $cstr;" # This has to form valid C statement
示例输出:
const char *str = "Hello, \"C\" string\n";
答案 0 :(得分:3)
#!/usr/bin/perl
use strict;
use warnings;
my $str = q/Hello, "C" string/ . "\n";
$str =~ s/(\W)/sprintf('\\%03o',ord($1))/ge;
print "const char *str = \"$str\";"
RegEx匹配除a-z A-Z 0-9 _
之外的每个字符,并将其转换为八进制值。您可以通过任何更具体的匹配来轻松替换(\W)
,例如([^a-zA-Z0-9,\.\-])
(匹配除a-z A-Z 0-9 , . -
之外的所有内容)或([\x00-\x1f])
(匹配每个小于30的ASCII代码=空格)。
更短的解决方案是:
$str =~ s/(["'`])/\\$1/g;
但是那个只能用\
前缀来转义引号。所有其他可能导致麻烦的字符都可以通过而无需替换。
答案 1 :(得分:3)
似乎Perl为此目的提供了B::cstring
函数:
<强>:字符串(STR)强>
返回双引号包含的STR转义版本 在C源代码中用作字符串。
print B::cstring(q/hi "C" string/)
# prints "hi \"C\" string"
答案 2 :(得分:1)
这样可以正常工作
#include <stdio.h>
int main(int argc, char *argv[]) {
printf("\110\145\154\154\157\054\040\167\157\162\154\144\012");
}
Hello, world