| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4148 人关注过本帖
标题:C++中string类对象不使用空字符‘\0’来标记字符串结尾,那么下面的代码为什 ...
只看楼主 加入收藏
yq1557
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2018-2-24
结帖率:100%
收藏
 问题点数:0 回复次数:6 
C++中string类对象不使用空字符‘\0’来标记字符串结尾,那么下面的代码为什么会在字符串结尾结束循环?
#include<iostream>
#include<string>
int main()
{
    using namespace std;
    string name;
    cout << "Enter your first name,Please: ";
    cin >> name;
    int i = 0;
    while (name[i]!=0)
    {
        cout << name[i] << ": " << int(name[i])<<endl;
        i++;
    }
    system("pause");
    return 0;
我的意思是,C++中string类对象既然不使用空字符‘\0’来标记字符串结尾,
那么上述代码为什么会知道在我输入的字符串(例如我输入:name)的结尾处结束循环,
并且输出时只输出name,以及每个字母对应的ASCII码,
而我使用的是name[i]!=‘\0’这种用于char数组字符串结尾的判断条件呀

[此贴子已经被作者于2018-2-26 19:16编辑过]

搜索更多相关主题的帖子: C++ string 字符串 循环 name 
2018-02-26 16:55
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9029
专家分:54050
注 册:2011-1-18
收藏
得分:0 
在C++98时,你这段代码属于未定义行为。那时只要求.c_str()以null字符结尾
从C++11始,要求以null字符结尾,所以正确
2018-02-26 20:38
yq1557
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2018-2-24
收藏
得分:0 
回复 2楼 rjsp
你好,我是自学C++新手,你说的null,我查了一下,解释是这样的:
空字符串是"",会创建一个对象,内容是"",有内存空间(存的是空字符串,内存空间已经分配给他一个 0/ 存在栈里)。
而NULL,不会创建对象,没有内存空间。
形象的比喻:
"" 相当于我的钱包里没钱
NULL 相当于我没有钱包

但是,这和while(name[i]!='\0')有什么联系,为什么string对象对于用于char数组字符串结尾的判断条件仍然可以使用呢?
能不能讲讲。
2018-02-26 21:16
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9029
专家分:54050
注 册:2011-1-18
收藏
得分:0 
我说的是“null字符”不是“null”
2018-02-26 22:11
yq1557
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2018-2-24
收藏
得分:0 
回复 4楼 rjsp
那个,我有点笨,理解不是太快,你看我这样的理解正确吗?

你说的“null字符”,其实就是我理解的空字符‘\0',

在C++11之前,string后面默认没有结束符,只有C风格的字符串数组是以'\0'结尾,所以我的那段代码会有问题。

而在新的C++11后,编译器的厂商会在string结尾后默认加上’\0',所以那段代码是正确的(实际上到现在string字符后面也没有结束符,它是一种容器,本身带有长度,不需要结束符作为存贮的边界)

我这样的理解是不是合适了?
2018-02-26 23:10
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9029
专家分:54050
注 册:2011-1-18
收藏
得分:0 
回复 5楼 yq1557


但“(实际上到现在string字符后面也没有结束符”不理解,现在的string后面有个null字符,虽然从不以它为结束符。
2018-02-27 08:29
yq1557
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2018-2-24
收藏
得分:0 
回复 6楼 rjsp
谢谢您!
2018-02-27 10:01
快速回复:C++中string类对象不使用空字符‘\0’来标记字符串结尾,那么下面的代 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.170744 second(s), 11 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved