字符串比 C 语言中预期的要长
String is longer than expected in C
这是我的代码
#include <stdio.h>
#include <string.h>
int main(){
char pal[8] = "ciaooaic";
char pal1[7] = "ciaoaic";
int lenPal = strlen(pal);
int lenPal1 = strlen(pal1);
printf("strlen('%s'): %d\n", pal, lenPal);
printf("strlen('%s'): %d\n", pal1, lenPal1);
return 0;
}
问题是当我 运行 这段代码的输出是:
strlen('ciaooaicP@'): 11
strlen('ciaoaic'): 7
第一个字符串在 P 和 @ 之间还有另一个不可打印的字符。我是菜鸟,所以也许我错过了一些明显的东西。有人可以帮助我吗?
编辑:
just give one extra space like char pal[9] = "ciaooaic"; char pal1[8] = "ciaoaic";
它有效,但为什么呢?我知道 \0 应该有一个 space,但是 "ciaoaic" 没有它也能工作...
您没有为 NULL 终止字符 [=12=]
保留 space。
要么将数组的大小增加 1
char pal[9] = "ciaooaic";
char pal1[8] = "ciaoaic";
或
完全不指定长度
char pal[] = "ciaooaic";
char pal1[] = "ciaoaic";
1. 您没有为空终止符留出空间,因为您将它们传递给 strlen()
,因此您的代码表现出 未定义的行为-
char pal[8] = "ciaooaic";
char pal1[7] = "ciaoaic";
为'[=14=]'
留一个space。像这样声明和初始化 -
char pal[9] = "ciaooaic";
char pal1[8] = "ciaoaic";
2. 而 strlen()
returns size_t
而不是 int
,所以这样写 -
size_t lenPal = strlen(pal);
size_t lenPal1 = strlen(pal1);
并使用 %zu
说明符打印这两个变量。
以上两个答案足以解决你的疑惑。
将 pal 和 pal1 的长度都增加一,因为末尾没有 space 用于分配空字符 ('\0')。
但是有一个小技巧可以使用 printf
打印非空终止字符
printf("strlen('%.*s'): %d\n",8, pal, lenPal);
printf("strlen('%.*s'): %d\n",7, pal1, lenPal1);
Link 上面的技巧:BRILLIANT
这是我的代码
#include <stdio.h>
#include <string.h>
int main(){
char pal[8] = "ciaooaic";
char pal1[7] = "ciaoaic";
int lenPal = strlen(pal);
int lenPal1 = strlen(pal1);
printf("strlen('%s'): %d\n", pal, lenPal);
printf("strlen('%s'): %d\n", pal1, lenPal1);
return 0;
}
问题是当我 运行 这段代码的输出是:
strlen('ciaooaicP@'): 11
strlen('ciaoaic'): 7
第一个字符串在 P 和 @ 之间还有另一个不可打印的字符。我是菜鸟,所以也许我错过了一些明显的东西。有人可以帮助我吗?
编辑:
just give one extra space like char pal[9] = "ciaooaic"; char pal1[8] = "ciaoaic";
它有效,但为什么呢?我知道 \0 应该有一个 space,但是 "ciaoaic" 没有它也能工作...
您没有为 NULL 终止字符 [=12=]
保留 space。
要么将数组的大小增加 1
char pal[9] = "ciaooaic";
char pal1[8] = "ciaoaic";
或
完全不指定长度
char pal[] = "ciaooaic";
char pal1[] = "ciaoaic";
1. 您没有为空终止符留出空间,因为您将它们传递给 strlen()
,因此您的代码表现出 未定义的行为-
char pal[8] = "ciaooaic";
char pal1[7] = "ciaoaic";
为'[=14=]'
留一个space。像这样声明和初始化 -
char pal[9] = "ciaooaic";
char pal1[8] = "ciaoaic";
2. 而 strlen()
returns size_t
而不是 int
,所以这样写 -
size_t lenPal = strlen(pal);
size_t lenPal1 = strlen(pal1);
并使用 %zu
说明符打印这两个变量。
以上两个答案足以解决你的疑惑。 将 pal 和 pal1 的长度都增加一,因为末尾没有 space 用于分配空字符 ('\0')。 但是有一个小技巧可以使用 printf
打印非空终止字符printf("strlen('%.*s'): %d\n",8, pal, lenPal);
printf("strlen('%.*s'): %d\n",7, pal1, lenPal1);
Link 上面的技巧:BRILLIANT