字符串比C中的预期长

时间:2015-11-14 10:36:45

标签: c string strlen

这是我的代码

#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和@之间还有另一个不可打印的字符。我是一个菜鸟,所以也许我错过了一些明显的东西。有人能帮助我吗?

编辑:

  

只需给一个额外的空间,比如char pal [9] =&#34; ciaooaic&#34 ;; char pal1 [8] =&#34; ciaoaic&#34 ;;

它有效,但为什么?我明白应该有\ 0的空间,但是&#34; ciaoaic&#34;没有它工作......

3 个答案:

答案 0 :(得分:4)

1。当您将空格传递给strlen()时,您不会为空终止符留空格,因此您的代码会显示未定义的行为 - < / p>

char pal[8] = "ciaooaic";
char pal1[7] = "ciaoaic";

'\0'留出空间。像这样声明和初始化 -

char pal[9] = "ciaooaic";
char pal1[8] = "ciaoaic";

2。strlen()返回size_t而不是int,所以写得像这样 -

size_t lenPal = strlen(pal);
size_t lenPal1 = strlen(pal1);

并使用%zu说明符打印这两个变量。

答案 1 :(得分:2)

您没有为NULL终止字符\0保留空间。

将数组的大小增加1

char pal[9] = "ciaooaic";
char pal1[8] = "ciaoaic";

OR

不要指定长度

char pal[] = "ciaooaic";
char pal1[] = "ciaoaic";

答案 2 :(得分:0)

上述答案都足以解决您的疑虑。 将pal和pal1的长度都增加1,因为在末尾没有空格来分配空字符(&#39; \ 0&#39;)。 但是,使用printf

打印非null终止字符有一个小技巧
printf("strlen('%.*s'): %d\n",8, pal, lenPal);
printf("strlen('%.*s'): %d\n",7, pal1, lenPal1);

上述技巧的链接:BRILLIANT