读书人

哈哈哈处女之后又一贴有不动了指

发布时间: 2013-01-05 15:20:40 作者: rapoo

哈哈,处女之后又一贴,有不动了,指点指点
我举个简单的例子
#include<stdio.h>
#include<string.h>
int main()
{
int i,a[10];
gets(a);
i=strlen(a);
printf("%d\n",i);
}
VC的编译器,
为什么这里定义了数组长度10,但是如果有12个字符也会照常输出结果!!
为什么???
[解决办法]
首先声明gets是用来读取字符串的,并把换行符转化为'\0',你的程序不能顺利通过编译。
修改一下:

#include<stdio.h>
int main()
{
char i,a[10];
gets(a);
i=strlen(a);
printf("%d\n",i);
}

如果a的地址为0x240ff40,那么你输入12121212121212111121一共20个字符的内存如下所示:
0x240ff40:31 32 31 32 31 32 31 32
0x240ff48:31 32 31 32 31 32 31 31
0x240ff50:31 31 32 31 00
所以a的长度被认为20
[解决办法]
gets这个函数他不会只接受10个字节的输入,而是有多少接受多少 直到你回车了为止
至于a[10] 你虽然定义了了他是10个字符 a[0]-a[9],但是如果gets接受的超过了10个字符
多余的字符实际上是会从 a[10]这个地址开始继续往下存
strlen(a)它是一直计算到'\0'为止 '\0'如果是在a[9]之后的地址上 是同样会被计算在内的
[解决办法]
这就好比有人闯了红灯,但此时却没有交警和汽车,所以可以安全的通过。但是有二者之一的话就可能有问题。
对于字符串输入最好使用fgets函数:

#include<stdio.h>
int main()
{
char i,a[10];
fgets(a, 10, stdin);//10是数组定义长度
i = strlen(a);
printf("%d\n",i);
}

[解决办法]
越界了呗。c++手动检查是否越界
[解决办法]
引用:
这就好比有人闯了红灯,但此时却没有交警和汽车,所以可以安全的通过。但是有二者之一的话就可能有问题。
对于字符串输入最好使用fgets函数:


C/C++ code
?



123456789

#include<stdio.h> int main() { char i,a[10]; fgets(a, 10, stdin);//10是数组定义长度 i = str……

是啊,虽然可以编译通过,但是,是违法的。

读书人网 >C语言

热点推荐