我做了一个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();
}
答案 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
,但它在那里。