当我碰到这个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/

    10-10 16:38
    查看更多