对C字符串常量感到困惑

罗伯·L

当我遇到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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Groovy ArrayList对字符串感到困惑

来自分类Dev

字符串中的Windows文件路径对于转义字符感到困惑

来自分类Dev

关于将字符串获取到二维数组感到困惑

来自分类Dev

powershell对数组循环,foreach方法,字符串感到困惑吗?

来自分类Dev

对C#字符的特殊含义感到困惑

来自分类Dev

对Rcpp中的字符串串联感到困惑

来自分类Dev

C ++字符串文字仍然令人困惑

来自分类Dev

关于C语言中的数组和字符串的困惑

来自分类Dev

常量字符串替换

来自分类Dev

字符到字符串。使困惑

来自分类Dev

字符到字符串。使困惑

来自分类Dev

更改常量字符串(C99)

来自分类Dev

Python C-API访问字符串常量

来自分类Dev

Objective-C可空性:限定常量字符串

来自分类Dev

创建全局常量C字符串的正确方法

来自分类Dev

C ++弃用了从字符串常量到'char *'[]的转换

来自分类Dev

C#字符串必须为常量

来自分类Dev

C#:属性与常量的不同字符串编码

来自分类Dev

C ++。优化使用大量常量字符串的程序

来自分类Dev

更改常量字符串(C99)

来自分类Dev

为什么在C语言中“字符串”被视为“常量”?

来自分类Dev

Java的8困惑 - >字符串::与compareToIgnoreCase

来自分类Dev

Bash:常量字符串的子字符串

来自分类Dev

真的对c ++继承感到困惑

来自分类Dev

对C ++多重继承感到困惑

来自分类Dev

C ++-对声明枚举感到困惑

来自分类Dev

对C ++类用法感到困惑

来自分类Dev

对C中的for循环感到困惑

来自分类Dev

Java中字符串常量的串联