递增 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!";
如果我们想将空字符 '\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!";