为什么它显示6作为数组的长度而不是5?

时间:2015-11-25 12:01:30

标签: c arrays

我做了一个c程序,我正在计算数组的长度。

但是当我输入一个字符串时,它会显示一个额外的字符,就像我输入"Jason"时长5个字符,显示6个字符。

此外,我已经创建了一个遍历每个元素的循环,并且我还看到了6个值,其中第6个似乎是垃圾值。

以下是代码:

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

void main()
{
    char a[5];
    int i;
    printf("Enter a string: ");
    gets(a);
    for (i=0; a[i]!='\0'; i++){
        printf(Ch no %d is %c \n",i,a[i]);
    }
    printf("Lentgh of array = %d",i);
    getch();
}

enter image description here

3 个答案:

答案 0 :(得分:2)

gets()在输入字符串中的字符后添加空字符。如果你键入&#34; Jason&#34;,这是5个字符长,你应该制作你的数组大小&#34; 6&#34;,为函数附加的空字符提供空间(见链接)。 / p>

当您键入&#34; Jason&#34;时,您的代码显示未定义的行为。 (因为你的a数组溢出了。)

另外,作为一种好的做法,避免在新的C ++代码中使用C风格的数组。首选std::vector,或在此特定情况下std::string。这些将为您处理内存管理,避免潜在的溢出,如您所示。

如果要将此代码编译为C ++代码,则应使用以下格式包含C头:

#include <cstdio>

最后,{C} 11标准以来,gets已被弃用。如果你编写C ++代码,你应该考虑更近期(和更安全)的替代方案。 (感谢@Matthew Gunn的评论)。

答案 1 :(得分:1)

由于你没有用空数据初始化数组,最后一个元素是垃圾,因为你的字符串不够长,无法设置最后一个元素。

还要记住,数组是基于零的,不要将数组的长度与以null结尾的字符串的长度混淆。例如:

char someString[10] = "jason";

sizeof(someString) // will be 10
strlen(someString) // will be 5

答案 2 :(得分:0)

C中的字符串全部由空字节(\0)终止。您对gets()函数的调用会自动将其添加到您的字符串中,因此字符串"Jason"实际上是一个字符数组,如下所示:

{'J','a','s','o','n','\n','\0'}

你看,实际上是7个字符。设计strlen()并不计算\0,但它在那里。