小编lem*_*erg的帖子

perl的$ - [0]为非ASCII数据产生意外结果

考虑文件中的以下输入数据y.txt(以UTF-8编码).

bar
föbar
Run Code Online (Sandbox Code Playgroud)

和一个文件y.pl,它将两个输入行放入一个数组并处理它们,寻找子串起始位置.

use open qw(:std :utf8);

my @array;

while (<>) {
  push @array, $_;
  print $-[0] . "\n" if /bar/;
}

# $array[0] = "bar", $array[1] = "föbar"
print $-[0] . "\n" if $array[1] =~ /$array[0]/u;
Run Code Online (Sandbox Code Playgroud)

如果我打电话perl y.pl < y.txt,我会

0
2
3
Run Code Online (Sandbox Code Playgroud)

作为输出.但是,我希望最后一个数字也是2,但由于某种原因,第二个正则/.../表达式表现不同.我错过了什么?我想这是一个编码问题,但无论我怎么做,我都没有成功.这是Perl 5.18.2.

regex perl utf-8

9
推荐指数
1
解决办法
105
查看次数

文本打包算法

我打赌有人之前已经解决了这个问题,但我的搜索结果是空的.

我想将一个单词列表打包到一个缓冲区中,跟踪每个单词的起始位置和长度.诀窍是我想通过消除冗余来有效地打包缓冲区.

示例:娃娃娃娃屋

这些可以简单地打包到缓冲区中dollhouse,记住doll是从位置0开始的四个字母,在0处dollhouse是九个字母,house在3处是五个字母.

到目前为止我想出的是:

  1. 排序最长到最短的单词:(娃娃屋,房子,娃娃)
  2. 扫描缓冲区以查看字符串是否已作为子字符串存在,如果是,请记下该位置.
  3. 如果它尚不存在,请将其添加到缓冲区的末尾.

由于长词通常包含较短的单词,因此效果很好,但应该可以做得更好.例如,如果我将单词列表扩展为包含ragdoll,那么我的算法会出现dollhouseragdoll效率低于ragdollhouse.

这是一个预处理步骤,所以我对速度并不十分担心.O(n ^ 2)很好.另一方面,我的实际列表有数万个单词,所以O(n!)可能是不可能的.

作为旁注,这个存储方案用于TrueType字体的`name'表中的数据,参见.http://www.microsoft.com/typography/otspec/name.htm

algorithm text packing

7
推荐指数
1
解决办法
1699
查看次数

gdb:将char数组显示为大端字节短裤

假设我有一个像

char foo[] = { 0, 1, 1, 0 };
Run Code Online (Sandbox Code Playgroud)

gdbx86机器上,如果我说

p (short[2])*foo
Run Code Online (Sandbox Code Playgroud)

我懂了

{256, 1}
Run Code Online (Sandbox Code Playgroud)

这就是说,两个字节short按小端顺序解释。

是否有一种方便的方法(例如宏)来使gdb字节数组显示为大端短(或其他类型)呢?

c debugging gdb endianness

5
推荐指数
1
解决办法
1964
查看次数

C ++“替换”为具有灵活数组成员的结构

考虑下面的C99结构,以灵活的数组成员结尾:

struct hdr
{
  size_t len;   
  size_t free;  
  char buf[];
};
Run Code Online (Sandbox Code Playgroud)

len例如,使用这样的内联函数(放入头文件中)进行访问,并将其buf作为参数:

static inline size_t slen(const char *s)
{
  struct hdr *h = (struct hdr*)(s - (int)offsetof(struct hdr, buf));
  return h->len;
}
Run Code Online (Sandbox Code Playgroud)

这是库的一部分,将使用C编译器进行编译。但是,我想从C ++访问该库。这实质上意味着相应的头文件(带有适当的extern "C" {...}防护)必须是有效的C ++代码。一种可能的解决方案是slen在源代码主体中定义功能,而完全避免使用内联代码,但这不是最佳选择。

我的想法是定义一个有效的虚拟C ++结构,并且可以通过某种方式将其映射到hdr,例如

struct cpp_hdr
{
  size_t len;
  size_t free;
  char buf[1];
}
Run Code Online (Sandbox Code Playgroud)

请注意,我只希望得到正确的(负)的偏移值lenfree; 没有访问buf的意图。

现在我的问题是:是否有任何保证

static inline size_t slen(const char *s)
{
  struct cpp_hdr *h = (struct cpp_hdr*)(s …
Run Code Online (Sandbox Code Playgroud)

c c++ arrays flexible-array-member

5
推荐指数
1
解决办法
879
查看次数

标签 统计

c ×2

algorithm ×1

arrays ×1

c++ ×1

debugging ×1

endianness ×1

flexible-array-member ×1

gdb ×1

packing ×1

perl ×1

regex ×1

text ×1

utf-8 ×1