递增 C 字符串中的空字符和 C 字符串索引中的 strlen() 用法

Incrementing the Null Character in a C-string and strlen() usage in C-string index

如果我们想将空字符 '\0' 递增 60,假设字符串大小事先已知,那么我们可以执行以下操作:

#include <stdio.h>

int main() {
    char str1[] = "Hello!"; 
    str1[6] += 60;

    printf("%s\n", str1);

    return 0;
}

我们得到的输出是:

Hello!<

但是,如果我们不知道字符串的大小,那么我们可以这样使用 strlen:

#include <stdio.h>
#include <string.h>

int main() {
    char str1[] = "Hello!"; 
    str1[strlen(str1) + 1] += 60;

    printf("%s\n", str1);

    return 0;
}

然而,这输出:

Hello!

如您所见,它根本没有改变。在第二种情况下我做错了什么?另外,我认为数组大小是静态的并且大小不会改变,所以在第二种情况下我们“添加”了一个字符怎么可能。

str1[strlen(str1) + 1] 是空终止符之后的字符。只需更改为 str1[strlen(str1)]

想一想。 strlen("")0.

还请记住,C 索引数组从零开始,因此字符串 str 中的最后一个字符位于 str[strlen(str) - 1]

但是,请记住,打印已更改空终止符的字符串并不是一个好主意。这将在打印它们时导致未定义的行为,因此严格来说,您不能真正从输出中得出结论。在这种情况下,我上面说的是一个非常非常有可能的解释。但是如果调用UB,程序就变得不可预测了。

数组索引从 zero 开始,所以它应该是:

str1[strlen(str1)] += 60;

但您还需要添加空字符。

str1[strlen(str1) + 1] = 0;

但请记住,str1 数组必须有足够的 space。你不能 access arrays outside their bounds.

所以不能像你的例子那样定义。它必须有(至少)8 个元素:

char str1[8] = "Hello!";