C语言中关于字符数组的长度问题
#include<stdio.h>#include<string.h>main(){charp[10]="abc",s[]="abc",q[10]={'a','b','c...
#include<stdio.h>
#include<string.h>
main()
{
char p[10]="abc",s[]="abc",q[10]={'a','b','c'},r[]={'a','b','c'};
printf("%d %d %d %d\n",strlen(p),strlen(s),strlen(q),strlen(r));
}
结果为什么是:3 3 3 7
求高手 指导,谢谢! 展开
#include<string.h>
main()
{
char p[10]="abc",s[]="abc",q[10]={'a','b','c'},r[]={'a','b','c'};
printf("%d %d %d %d\n",strlen(p),strlen(s),strlen(q),strlen(r));
}
结果为什么是:3 3 3 7
求高手 指导,谢谢! 展开
11个回答
展开全部
哎。strlen()是在string.h里面的,getch()是在conio.h里面的,不过,我用的是CFree,至于其它的编译器,我就不知道了。
至于你的问题,当你仔细看看他们的结果,你就会有结论了。
很明显,strlen(q)的值是一样的,不同的是p的字符长度
而它们的区别,就在于,它们一个有数组的长度,另一个没有。
数组q,它的长度是10,所以一开始就会分配10个大小为sizeof(char)的空间,然后,就把a,b,c分别放进从分配的第一个,第二个,第三个空间里面,然后,剩下的变为0()也就是'\0'。
所以用strlen(q)的时候,就是3
而没有长度的p,它缺省了长度,所以系统就会按你给的元素个数分配,这里p有3个元素,所以就分配3个大小为sizeof(char)的空间,当你用strlen(p)的时候,因为strlen()是以字符串终结符'\0'来判定字符串长度的,所以呢,strlen(p)是一个不确定值。
如果你还没能理解为什么是一个不确定值,那就继续看下去。
在C中,是不会检测是否越界的,你可以顺着数组一直访问下去,比如你定义一个 int a[10]
你可以访问a[12],a[13](当然也可以访问a[-1],a[-100]),只是这些值是不确定的。它访问的方式,是从数组的起始地址开始,按照数组下标值,进行相对位移(它们所跳过的长度是数组类型的长度,比如上面,是跳过sizeof(int)的长度)。
而strlen()就是从它首地址开始,一个个开始检测,是否达到'\0‘,然后返回长度值。
当你调用strlen()的时候,如果没有终止符'\0’,它就会越界检查,直到找到'\0‘。
就像 char a[3]={'a','b','c'},它也是一个不确定值。
明白了没,不懂继续追问。
写这么多,真的好累。。。
至于你的问题,当你仔细看看他们的结果,你就会有结论了。
很明显,strlen(q)的值是一样的,不同的是p的字符长度
而它们的区别,就在于,它们一个有数组的长度,另一个没有。
数组q,它的长度是10,所以一开始就会分配10个大小为sizeof(char)的空间,然后,就把a,b,c分别放进从分配的第一个,第二个,第三个空间里面,然后,剩下的变为0()也就是'\0'。
所以用strlen(q)的时候,就是3
而没有长度的p,它缺省了长度,所以系统就会按你给的元素个数分配,这里p有3个元素,所以就分配3个大小为sizeof(char)的空间,当你用strlen(p)的时候,因为strlen()是以字符串终结符'\0'来判定字符串长度的,所以呢,strlen(p)是一个不确定值。
如果你还没能理解为什么是一个不确定值,那就继续看下去。
在C中,是不会检测是否越界的,你可以顺着数组一直访问下去,比如你定义一个 int a[10]
你可以访问a[12],a[13](当然也可以访问a[-1],a[-100]),只是这些值是不确定的。它访问的方式,是从数组的起始地址开始,按照数组下标值,进行相对位移(它们所跳过的长度是数组类型的长度,比如上面,是跳过sizeof(int)的长度)。
而strlen()就是从它首地址开始,一个个开始检测,是否达到'\0‘,然后返回长度值。
当你调用strlen()的时候,如果没有终止符'\0’,它就会越界检查,直到找到'\0‘。
就像 char a[3]={'a','b','c'},它也是一个不确定值。
明白了没,不懂继续追问。
写这么多,真的好累。。。
展开全部
// Baidu.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "iostream"
#include "fstream"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
int i=0;
char p[]={'a','b','c'},q[10]={'a','b','c'};
printf("%d %d\n",strlen(p),strlen(q));
//while(p[i]!='\0')
//{
// cout<<p[i]<<" ";
// i++;
//}
getchar();
getchar();
return 0;
}
按照你说的我也测试过了,我用vs2008平台输出的是12 3.。
首先可以看一下strlen()这个function,他是测试字符串的实际长度,现在我们是用字符数组当作字符串用,也就是把字符数组的首指针当做字符串的首指针,但是在不同平台中字符串的长度在一定的范围内是给定的,因为对于处理变长的字符串还是比较难的。所以测试的时候出现了这样的情况。你按照这个理解就好。
我另外测试了,像这种的情况,一般在vs2008中是实际长度+9,所以我测出来的是12。
//
#include "stdafx.h"
#include "iostream"
#include "fstream"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
int i=0;
char p[]={'a','b','c'},q[10]={'a','b','c'};
printf("%d %d\n",strlen(p),strlen(q));
//while(p[i]!='\0')
//{
// cout<<p[i]<<" ";
// i++;
//}
getchar();
getchar();
return 0;
}
按照你说的我也测试过了,我用vs2008平台输出的是12 3.。
首先可以看一下strlen()这个function,他是测试字符串的实际长度,现在我们是用字符数组当作字符串用,也就是把字符数组的首指针当做字符串的首指针,但是在不同平台中字符串的长度在一定的范围内是给定的,因为对于处理变长的字符串还是比较难的。所以测试的时候出现了这样的情况。你按照这个理解就好。
我另外测试了,像这种的情况,一般在vs2008中是实际长度+9,所以我测出来的是12。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我在 linux下打印为 6, 3;
在因为在 p[] 的最后没有加上 '\0', 所以 strlen(p)时会把 Q中的字符也算上.
你试着把 Q中的 a,b,c 改为 D,E,F , 然后再 printf(p), 此时打印就为 abcDEF.
把 char p[]={'a','b','c', '\0'}, q[10]={'a','b','c', '\0'}; 即可.
或者不要那么费力,直接写为
char p[] = "abc" ; // 它会在后面加 '\0'; 此时sizeof(p) 为 4 ;
char Q[10] ="def" ;
结果就是你想要的.
在因为在 p[] 的最后没有加上 '\0', 所以 strlen(p)时会把 Q中的字符也算上.
你试着把 Q中的 a,b,c 改为 D,E,F , 然后再 printf(p), 此时打印就为 abcDEF.
把 char p[]={'a','b','c', '\0'}, q[10]={'a','b','c', '\0'}; 即可.
或者不要那么费力,直接写为
char p[] = "abc" ; // 它会在后面加 '\0'; 此时sizeof(p) 为 4 ;
char Q[10] ="def" ;
结果就是你想要的.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
r[]={'a','b','c'};
这是个字符数组,系统只为它分配了3个字节的空间,但是strlen只有遇到'\0'才会返回,于是它会向后继续进行,直到有'\0',这其实是越界(或许没有,可能访问的是q[10])了.
你可以这样
printf("%s\n", r);来查看下打印的信息。
在我的上面(TC)是
3 3 3 9
这是个字符数组,系统只为它分配了3个字节的空间,但是strlen只有遇到'\0'才会返回,于是它会向后继续进行,直到有'\0',这其实是越界(或许没有,可能访问的是q[10])了.
你可以这样
printf("%s\n", r);来查看下打印的信息。
在我的上面(TC)是
3 3 3 9
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询