当我遇到Porters Stemming算法的这种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"
一个连续的内存块形式的字符串吗?可能是我忽略了一些基本知识,但即使如此,我仍然想知道自己忽略了什么。我知道这是一个基本概念,但我在网络上找不到清晰的示例或情况来解释这一点,老实说,我不遵循输出。欢迎任何有帮助的评论。
这里至少发生三件事:
相互并置的文字字符串由编译器连接。"a" "b"
与完全相同"ab"
。
反斜杠是转义字符,这意味着它不会从字面上复制到结果字符串中。该符号\01
表示“ ASCII值为1的字符”。
该符号\0...
表示八进制字符常量。八进制数字以8为底,由0到7(含0和7)之间的数字组成。8不是有效的八进制常量,因此"\08"
不跟随"\07"
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句