免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3209 | 回复: 18
打印 上一主题 下一主题

今天一定要把这两个关于字符的问题搞清楚,不然睡觉都会做恶梦 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-05-06 19:10 |只看该作者 |倒序浏览
兄弟们帮我搞清楚下:
1.
char array[20];
cin>>array;//这里我输入hello,也就是五个字符,请问这里(是系统还是编译器,我不知道?)会自动在
第六个字符加上'\0'吗?
2.
char *p_array = array;
char *p1_array = new char[strlen(p_array)];//请问strlen(p_array)后面还要加1吗?什么情况下需要呢? 能举个例子吗?
strcpy(p1_array,p_array);

[ 本帖最后由 beautiful_good 于 2007-5-6 19:16 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-05-06 19:13 |只看该作者
1. 试一下就知道了
2. 看一下 strlen(p_arry) 是多少就知道了

论坛徽章:
0
3 [报告]
发表于 2007-05-06 19:20 |只看该作者
1.试了好像会,因为我对他进行了strlen(array)结果等于5,说明会自动在第六位加上'\0'.
这样的判断对吗?
2.主要的问题是strlen(p_array)不把'\0'算进去,而我又不知道p1_array要不要以'\0'结尾?

论坛徽章:
0
4 [报告]
发表于 2007-05-06 19:22 |只看该作者
strlen 做什么
strcpy 做什么
什么是字符串
<<是操作符重载,跟sscanf差不多,只不过它知道右边的类型。

论坛徽章:
0
5 [报告]
发表于 2007-05-06 19:23 |只看该作者
原帖由 beautiful_good 于 2007-5-6 19:20 发表
1.试了好像会,因为我对他进行了strlen(array)结果等于5,说明会自动在第六位加上'\0'.
这样的判断对吗?
2.主要的问题是strlen(p_array)不把'\0'算进去,而我又不知道p1_array要不要以'\0'结尾?


你用它吗?你不用就删除掉

论坛徽章:
0
6 [报告]
发表于 2007-05-06 19:25 |只看该作者
你不让'\0'结尾就要有别的方法表示 p1_array到底是什么

比如
bac\01231321
那么p1_array被认为是"bac"
如果没有'\0',bac1231321
那么p1_array到底表示 bac1 还是bac123或者别的无限长的串呢。

论坛徽章:
0
7 [报告]
发表于 2007-05-06 19:46 |只看该作者
问题是真的出现了
#include <iostream>
#include <string>
using namespace std;
int main()
{
    char array[20];
    cin>>array;
    char *p_array = array;
    char *p1_array = new char[strlen(p_array)];
    strcpy(p1_array,p_array);
    cout<<"array: "<<array<<endl;
    cout<<"p_array: "<<p_array<<endl;
    cout<<"p1_array: "<<p1_array<<endl;
    system("pause");
    return 0;
}
/*abc\0123321     //这里我有输入'\0'
array: abc\0123321//为什么这里不是输出abc,字符数组不是以'\0'结尾吗?
p_array: abc\0123321
p1_array: abc\0123321
请按任意键继续. . .*/

论坛徽章:
0
8 [报告]
发表于 2007-05-06 22:45 |只看该作者
1、如果你想知道cin是否会在字符串后面加上'\0' ,可以调试上面程序看看,实际情况是cin会在字符串后面加上'\0'(字符串结束符)。
2、C语言风格的字符串都以'\0'作为字符串结尾标记,因为如果缺少了该标记,如:strlen、strcpy等这类通过'\0'来判断字符串结束的函数操作将失效!
3、strlen返回字符串中实际的字符个数,不包含作为字符串结束标记的'\0'字符。
4、strcpy的函数原型为:
      char *strcpy( char *strDestination, const char *strSource );
         其中strSource为源语言字符串,strDestination为目标语言字符串。
   strcpy拷贝字符串时为了效率考虑,会将strSource中的每一个字符都拷贝到strDestination中,包括字符串结束标记'\0',不会监测为strDestination目标字符串分配的内存空间是否足够。

      因此在你上面的例子中为了把“源语言字符串”正确的拷贝到“目标语言字符串”中,同时不发生越界访问时,为目标语言字符串分配内存时需使用 new[strlen(strSource )+1],同时不要忘记使用完这块内存时需要回收: delete []strSource;
      还有就是'\0'好像不可以直接在控制台下输入!!!
   

    提示:我个人感觉最好不要把C语言风格的字符串操作函数和C++风格的字符串操作函数混用!

论坛徽章:
0
9 [报告]
发表于 2007-05-06 23:02 |只看该作者
谢谢windyheart ,flw2
我想我就是混淆了c和c++中的字符串,不够现在明白些了

论坛徽章:
0
10 [报告]
发表于 2007-05-06 23:02 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP