c - 字符串比 C 语言中预期的要长

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

编辑:

just give one extra space like char pal[9] = "ciaooaic"; char pal1[8] = "ciaoaic";

它有效,但为什么呢?我知道\0 应该有一个空格,但是“ciaoaic”没有它也能工作...

最佳答案

1. 当您将空终止符传递给 strlen() 时,您没有为空终止符留出空间,因此您的代码表现出未定义的行为 -

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 说明符打印这两个变量。

关于c - 字符串比 C 语言中预期的要长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33707486/

相关文章:

c++ - 循环具有相似名称的对象

c - 将变量移动到 cl 并使用内联汇编执行 shr

c - fscanf 不保存行 - C

c++ - 在 C/C++ 中,是否有类似于 #ifndef 的指令用于 typedef?

C# 创建不可为 null 的字符串。是否可以?不知何故?

python - pandas - 按部分字符串分组

c++ - 如果存储字符串的 char 数组小于字符串,那么 C++ 真正存储字符串的位置是什么?

C 字符串、strlen 和 Valgrind

c - 在 C 中,char 数组和 string 数组在 c 中显示不同的大小,但比较时它们是相同的

c++ - 在另一个进程完成后如何删除文件?