【发布时间】:2014-07-02 20:32:03
【问题描述】:
当我遇到这个C language implementation of Porters Stemming algorithm 时,我发现了一个令我困惑的 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" 形式的字符串是一个连续的内存块吗?可能是我忽略了一些基本的东西,但即便如此我想知道我忽略了什么。我知道这是一个基本概念,但我在网上找不到一个明确的例子或情况来解释这一点,老实说,我不遵循输出。欢迎任何有用的 cmets。
【问题讨论】:
-
@ShafikYaghmour:是的,我认为这是故意的。看起来好像代码正在尝试模拟 Pascal 字符串。