为什么 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
将有可用位置 0
和 1
因此当您将第三个单词作为输入传递时,您将尝试在数组边界之外写入。
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
数组之外,导致未定义的行为。
我不明白为什么 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
将有可用位置 0
和 1
因此当您将第三个单词作为输入传递时,您将尝试在数组边界之外写入。
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
数组之外,导致未定义的行为。