strlen 给出的数字大于数组的大小
strlen gives larger number than the size of an array
这可能是微不足道的,我希望有人能解释一下。为什么 strlen 给我的数字大于 char 数组的实际大小而不是 4:
这是我的代码:
#include <stdio.h>
#include <string.h>
int main ()
{
char szInput[4];
szInput [0] = '1';
szInput [1] = '1';
szInput [2] = '1';
szInput [3] = '1';
printf ("The sentence entered is %u characters long.\n",(unsigned)strlen(szInput));
return 0;
}
我以为我应该得到 4 作为输出,但我得到 6。
The sentence entered is 6 characters long.
你必须像这样用 '[=11=]'
结束你的字符串:
#include <stdio.h>
#include <string.h>
int main () {
char szInput[5];
szInput [0] = '1';
szInput [1] = '1';
szInput [2] = '1';
szInput [3] = '1';
szInput [4] = '[=10=]';
printf ("The sentence entered is %u characters long.\n", (unsigned)strlen(szInput));
return 0;
}
字符串末尾缺少'[=12=]'
。
#include <stdio.h>
#include <string.h>
int main ()
{
char szInput[5];
szInput [0] = '1';
szInput [1] = '1';
szInput [2] = '1';
szInput [3] = '1';
szInput [4] = '[=10=]';
printf ("The sentence entered is %u characters long.\n", (unsigned int)strlen(szInput));
return 0;
}
你应该总是在你的字符串中添加一个额外的字符来标记它的结束,这个额外的特殊值是 '[=12=]'
。
string.h
header 中的所有函数都期望这一点,strlen()
的工作方式会导致未定义的行为,因为您省略了终止 '[=12=]'
,a简单的实现看起来像
size_t length;
while (*(str++) != '[=11=]')
length++;
如果从未找到 '[=12=]'
,这可能会越界读取。
strlen
仅当字符数组中存在空终止符 '[=11=]'
时才有效。 (它 returns 最多但不包括该终止符的字符数)。
如果不存在则程序行为未定义。你能得到答案纯属巧合。
如果你写了 szInput[3] = '[=12=]';
那么你的程序将是明确定义的,答案将是 3。你可以写 szInput[3] = 0;
但为了清晰起见通常首选 '[=11=]'
(并且约定)在处理 char
文字时。
这可能是微不足道的,我希望有人能解释一下。为什么 strlen 给我的数字大于 char 数组的实际大小而不是 4: 这是我的代码:
#include <stdio.h>
#include <string.h>
int main ()
{
char szInput[4];
szInput [0] = '1';
szInput [1] = '1';
szInput [2] = '1';
szInput [3] = '1';
printf ("The sentence entered is %u characters long.\n",(unsigned)strlen(szInput));
return 0;
}
我以为我应该得到 4 作为输出,但我得到 6。
The sentence entered is 6 characters long.
你必须像这样用 '[=11=]'
结束你的字符串:
#include <stdio.h>
#include <string.h>
int main () {
char szInput[5];
szInput [0] = '1';
szInput [1] = '1';
szInput [2] = '1';
szInput [3] = '1';
szInput [4] = '[=10=]';
printf ("The sentence entered is %u characters long.\n", (unsigned)strlen(szInput));
return 0;
}
字符串末尾缺少'[=12=]'
。
#include <stdio.h>
#include <string.h>
int main ()
{
char szInput[5];
szInput [0] = '1';
szInput [1] = '1';
szInput [2] = '1';
szInput [3] = '1';
szInput [4] = '[=10=]';
printf ("The sentence entered is %u characters long.\n", (unsigned int)strlen(szInput));
return 0;
}
你应该总是在你的字符串中添加一个额外的字符来标记它的结束,这个额外的特殊值是 '[=12=]'
。
string.h
header 中的所有函数都期望这一点,strlen()
的工作方式会导致未定义的行为,因为您省略了终止 '[=12=]'
,a简单的实现看起来像
size_t length;
while (*(str++) != '[=11=]')
length++;
如果从未找到 '[=12=]'
,这可能会越界读取。
strlen
仅当字符数组中存在空终止符 '[=11=]'
时才有效。 (它 returns 最多但不包括该终止符的字符数)。
如果不存在则程序行为未定义。你能得到答案纯属巧合。
如果你写了 szInput[3] = '[=12=]';
那么你的程序将是明确定义的,答案将是 3。你可以写 szInput[3] = 0;
但为了清晰起见通常首选 '[=11=]'
(并且约定)在处理 char
文字时。