当我碰到这个C language implementation of Porters Stemming algorithm时,我发现自己对C-ism感到困惑。
#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"
。 关于对C字符串常量感到困惑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24540513/