字符数组问题 ???????

Mr_Yang 2005-11-12 08:48:30
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void main()
{
char string[10], str1[10];
char *string2 = "1234567890";
for(int I=0; I<10;I++)
{
str1[I] ='a';
}
cout<<sizeof(str1)<<endl; //结果为10
cout<<strlen(str1)<<endl; //结果为27 ??????????????
cout<<str1<<endl; //aaaaaaaaaa烫烫烫烫烫烫烫!!? ???????????????????

// strcpy(string, str1); //这里的strcpy会出错
// cout<<strlen(string)<<endl;
// cout<<string<<endl;

strcpy(string, string2); //这里的strcpy为什么不会出错?
cout<<strlen(string)<<endl; //10
cout<<sizeof(string)<<endl; //10
cout<<string<<endl; //1234567890
}


问题见程序..
...全文
231 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
pbcd 2005-11-13
  • 打赏
  • 举报
回复
主要是最后那个'/0'
fyps 2005-11-13
  • 打赏
  • 举报
回复
实际情况是,一直到第26个字符才发现'\0',因此会返回27。

这句话如何解释,是偶然,还是和编译器有关?
csucdl 2005-11-13
  • 打赏
  • 举报
回复
同意 megaboy(飞天御剑流之杀神一刀斩)
megaboy 2005-11-13
  • 打赏
  • 举报
回复
那应该每次运行的结果都不一样啊! 为什么我每次运行都是这个结果?
--------------------------------------------------------------
一不一样要看具体情况,你想看不一样的结果么?那就用另一个编译器,这样机会大一点。
zhoujunyi 2005-11-13
  • 打赏
  • 举报
回复
你怎么能用strlen来求字符数组得长度?你可以在字符数组中间位置写一个\0然后再看看。
zhoujunyi 2005-11-13
  • 打赏
  • 举报
回复
你好好看看sizeof和strlen,strlen是要找\0得,你那个27是个随机数
Mr_Yang 2005-11-13
  • 打赏
  • 举报
回复
按 megaboy(飞天御剑流之杀神一刀斩) 所说:


cout<<strlen(str1)<<endl; //结果为27??????????????
-----------------------------------------
你把str1的元素全部赋予'a',但strlen是通过查找'\0'来计算字符数量的,由于str1并没有'\0',它查找的时候会超出str1的范围,实际情况是,一直到第26个字符才发现'\0',因此会返回27。


strcpy(string, str1); //这里的strcpy会出错
-------------------------------------------------
从上面strlen(str1)一句看来,str1所指向的字符串有27个字符之多,超过了string的十个字节范围,覆盖了其它内存,出不出错是不一定的,如果这段内存没有用途,就不会出错,有用就有可能出错。


strcpy(string, string2); //这里的strcpy为什么不会出错?
------------------------------------------------------------
string2指向的字符串常量加上'\0'共有11个字符,而string只有十个字节的空间,string范围之后的一个字节被覆盖,是否出错不一定,视该内存单元是否有用而定,有用的话就会出错,没用的话就不会出错。


那应该每次运行的结果都不一样啊! 为什么我每次运行都是这个结果?
zhanglu520ily 2005-11-13
  • 打赏
  • 举报
回复
str1[]缺少'\0',所有问题都是缺少'\0'.
这样就OK:
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void main()
{
char string[10], str1[10];
char *string2 = "1234567890";
for(int I=0; I<9;I++)
{
str1[I] ='a';
}
str1[9]='\0'
cout<<sizeof(str1)<<endl; //结果为10
cout<<strlen(str1)<<endl; //结果为27 ??????????????
cout<<str1<<endl; //aaaaaaaaaa烫烫烫烫烫烫烫!!? ???????????????????

//strcpy(string, str1); //这里的strcpy会出错
//cout<<strlen(string)<<endl;
//cout<<string<<endl;

strcpy(string, string2); //这里的strcpy为什么不会出错?
cout<<strlen(string)<<endl; //10
cout<<sizeof(string)<<endl; //10
cout<<string<<endl; //1234567890
}
RedWolf1999 2005-11-12
  • 打赏
  • 举报
回复
上面的那个str1本身是一个数组名,那它返回的肯定是这个数组的长度,没啥可说的。
jsj20 2005-11-12
  • 打赏
  • 举报
回复
cout<<sizeof(str1)<<endl; //结果为10
cout<<strlen(str1)<<endl; //结果为27
这个怎么回事啊,一个是十,那下句怎么会是27呢?
megaboy 2005-11-12
  • 打赏
  • 举报
回复
cout<<strlen(str1)<<endl; //结果为27??????????????
-----------------------------------------
你把str1的元素全部赋予'a',但strlen是通过查找'\0'来计算字符数量的,由于str1并没有'\0',它查找的时候会超出str1的范围,实际情况是,一直到第26个字符才发现'\0',因此会返回27。


strcpy(string, str1); //这里的strcpy会出错
-------------------------------------------------
从上面strlen(str1)一句看来,str1所指向的字符串有27个字符之多,超过了string的十个字节范围,覆盖了其它内存,出不出错是不一定的,如果这段内存没有用途,就不会出错,有用就有可能出错。


strcpy(string, string2); //这里的strcpy为什么不会出错?
------------------------------------------------------------
string2指向的字符串常量加上'\0'共有11个字符,而string只有十个字节的空间,string范围之后的一个字节被覆盖,是否出错不一定,视该内存单元是否有用而定,有用的话就会出错,没用的话就不会出错。
Mr_Yang 2005-11-12
  • 打赏
  • 举报
回复
怎么没有人顶啊?
Mr_Yang 2005-11-12
  • 打赏
  • 举报
回复
这个程序的正确性不重要,我关键是要搞清楚为什么会出现上述情况.

知道的人请帮忙解答下,谢谢了.
Mr_Yang 2005-11-12
  • 打赏
  • 举报
回复
strcpy(string, string2); //这里的strcpy为什么不会出错? string2是个字符指针,常量符串后面有个结束标志'\0',所以没有问题


这里为什么不会存在空间不够的问题?
sankt 2005-11-12
  • 打赏
  • 举报
回复
上面有点问题,重新来一次
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void main()
{
char string[11], str1[11];
char *string2 = "1234567890";//这里的空间占了11个字节,加了一个'\0'
memset(string,'\0',11);
memset(str1,'\0',11);

for(int I=0; I<10;I++)
{
str1[I] ='a';
}
cout<<sizeof(str1)<<endl; //结果为11
cout<<strlen(str1)<<endl; //10
cout<<str1<<endl;

strcpy(string, string2); //这里的strcpy为什么不会出错? string2是个字符指针,常量字符串后面有个结束标志'\0',所以没有问题

cout<<strlen(string)<<endl; //10
cout<<sizeof(string)<<endl; //11
cout<<string<<endl; //1234567890
}
sankt 2005-11-12
  • 打赏
  • 举报
回复
//稍微修改了一下,调试通过

#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void main()
{
char string[11], str1[11];
char *string2 = "1234567890";//这里的空间占了11个字节,加了一个'\0'
memset(string,'\0',11);
memset(str1,'\0',11);

for(int I=0; I<10;I++)
{
str1[I] ='a';
}
cout<<sizeof(str1)<<endl; //结果为10
cout<<strlen(str1)<<endl;
cout<<str1<<endl;

// strcpy(string, str1); //这里的strcpy会出错 //string大小是10,而str1的空间大小没有确定下来.
// cout<<strlen(string)<<endl;
// cout<<string<<endl;

strcpy(string, string2); //这里的strcpy为什么不会出错? string2是个字符指针,常量字符串后面有个结束标志'\0',所以没有问题
//即使这样,程序还是有问题,string的大小只有10.
cout<<strlen(string)<<endl; //10
cout<<sizeof(string)<<endl; //11
cout<<string<<endl; //1234567890
}
ma100 2005-11-12
  • 打赏
  • 举报
回复
for(int I=0; I<10;I++)
{
str1[I] ='a';
}
结尾没有'\0',strcpy 无法判断拷贝多少个了
sankt 2005-11-12
  • 打赏
  • 举报
回复
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void main()
{
char string[10], str1[10];
char *string2 = "1234567890";//这里的空间占了11个字节,加了一个'\0'

for(int I=0; I<10;I++)
{
str1[I] ='a';
}
cout<<sizeof(str1)<<endl; //结果为10
cout<<strlen(str1)<<endl; //结果为27 //str1没有结束标志'\0' ??????????????
cout<<str1<<endl; //aaaaaaaaaa烫烫烫烫烫烫烫!!? ???????????????????

// strcpy(string, str1); //这里的strcpy会出错 //string大小是10,而str1的空间大小没有确定下来.
// cout<<strlen(string)<<endl;
// cout<<string<<endl;

strcpy(string, string2); //这里的strcpy为什么不会出错? string2是个字符指针,常量字符串后面有个结束标志'\0',所以没有问题
cout<<strlen(string)<<endl; //10
cout<<sizeof(string)<<endl; //10
cout<<string<<endl; //1234567890
}

69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧