当我看到这个Porters Stemming算法的C语言实现时,我发现了一个我不理解的C-ism。
(说明:本段内容讲述作者在查阅与Porters Stemming算法相关的C语言实现时,对其中某些C语言特有的写法感到困惑。)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void test( char *s )
{
int len = s[0];
printf("len= %i\n", len );
printf("s[len] = %c\n", s[len] );
}
int main()
{
test("\07" "abcdefg");
return 0;
}
并输出:
len = 7
s[len] = g
然而,当我输入
test("\08" "abcdefgh");
或者任何长度超过7个字符的字符串常量与第一对括号中相应的长度(即 test("\09" "abcdefghi");
的输出为
len = 0
s[len] =
但是像
test("\01" "abcdefgh");
这样的任何输入都会打印出该位置上的字符(如果我们暂时将第一个字符位置称为1而不是0)。似乎
test(char *s)
读取了第一对括号中的数字(我不确定它是如何做到这一点的,因为我认为 s[0] 只能读取单个字符,即 '\'),并打印出第二对括号中字符串常量的该索引+1处的最后一个字符。我的问题是:似乎我们正在将两个字符串常量传递给
test(char *s)
。这里究竟发生了什么,也就是说,编译器似乎如何将字符串“分割”成两对括号?另一个可能会有的问题是,形如 "blah" "abcdefg"
的字符串是否是一段连续的内存块?可能我忽略了一些基本概念,但即使如此,我也想知道我忽略了什么。我知道这是一个基本概念,但我找不到一个清晰的例子或情境来解释这个问题,老实说我也不理解输出结果。欢迎任何有帮助的评论。