为什么 strlen() 函数给出了错误的值

why strlen() function is giving wrong value

我不明白为什么 strlen() 只为第一个字符串提供了错误的值(即:9)。之后值正确。

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

int main() {
    int m, i, j;
    i = 2;
    j = 5;
    char a[i][j];
    for (i = 0; i <= 2; i++)  {
        scanf("%s", a[i]);
    }
    m = strlen(a[0]);
    printf("%d\n", m); //here the problem is coming//
    m = strlen(a[1]);
    printf("%d\n", m);
    m = strlen(a[2]);
    printf("%d\n", m);

    return 0;
}

输入:

heyman
jack
bro

输出:

9
4
3

由于您的数组长度为 [2][5],因此您最多可以存储 2 个长度为 4 的单词,每个单词除了它的字母。

您的输入 heyman 意味着您写的字母太多,没有足够的 space 来存储 [=13=]。尝试使用更短的单词或将长度从 5 更改为 7.

此外,您在长度为 2 的数组中存储了 3 个单词,长度是指存储的元素数量,而不是您可以达到的数量。长度 2 将有可用位置 01 因此当您将第三个单词作为输入传递时,您将尝试在数组边界之外写入。

a的每一行只有5个字节。当你将 heyman 读入 a[0] 时,它会溢出到 a[1]。所以你有:

a[0] = "heyma"
a[1] = "n[=10=]"

那么当你读入a[1]时,你有

a[0] = "heyma"
a[1] = "jack[=11=]"

请注意 a[0] 中没有空终止符。因此,当您调用 strlen(a[0]) 时,它会经过 a[0] 的末尾并继续在 a[1] 中搜索空字节。 a[0] 中有 5 个字节,a[1] 中有 4 个字节,因此长度为 9。从技术上讲,这是未定义的行为,但这是实际实现中发生的情况,因为二维数组是连续的。

此外,当您读入 a[2] 时,您完全在 a 数组之外,导致未定义的行为。