cout输出字符串是不是遇 '\0' 就停止输出?

AlwaysToBeZero 2012-03-03 05:00:12
大牛们帮忙看看这代码:
#include <iostream>
#include <string>

using namespace std;

int main()
{
string s; //char s[255];
cin>>s;
s[4]='\0';
cout<<s<<endl;
system("pause");
return 0;
}

输入:asdfghjk
输出:asdf hjk

把string s;换成 char s[255];的话,就只输出前四个字符 asdf

求大牛解释怎么回事?
...全文
2049 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
AlwaysToBeZero 2012-03-08
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 yarpee 的回复:]
string对<<操作符是有重载的,string中有length成员变量记录着string长度,s[4]=0并未改变其长度。
参看:http://blog.csdn.net/yarpee/article/details/6837338
[/Quote]

好的,谢谢。
AlwaysToBeZero 2012-03-04
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 ctlg6969 的回复:]
从可移植的角度看,4楼的代码可以解决跨便宜平台的问题
[/Quote]

嗯,本以为很容易的问题,其实也不简单啊。
AlwaysToBeZero 2012-03-04
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 yanminhui163 的回复:]
引用 15 楼 alwaystobezero 的回复:
引用 13 楼 yanminhui163 的回复:
引用 10 楼 alwaystobezero 的回复:
引用 2 楼 yanminhui163 的回复:
效果一样,你再试一下下面的代码:

C/C++ code
#include <iostream>
#include <string>
using namespace s……
[/Quote]

不好意思啊,当时没考虑这个。
ctlg6969 2012-03-04
  • 打赏
  • 举报
回复
从可移植的角度看,4楼的代码可以解决跨便宜平台的问题
yanminhui163 2012-03-04
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 alwaystobezero 的回复:]
引用 13 楼 yanminhui163 的回复:
引用 10 楼 alwaystobezero 的回复:
引用 2 楼 yanminhui163 的回复:
效果一样,你再试一下下面的代码:

C/C++ code
#include <iostream>
#include <string>
using namespace std;

int main ()
{
string……
[/Quote]
你又没说用的是DEV-C++,如果是用DEV-C++须用C风格输出。不同的编译器,处理方式不同。
#include <cstdlib>
#include <iostream>
#include <string>

using namespace std;

int main(int argc, char *argv[])
{
string s ;

cin >> s ;
s[4] = '\0' ;
cout << s.c_str() << endl ;

system("PAUSE");
return EXIT_SUCCESS;
}
yarpee 2012-03-04
  • 打赏
  • 举报
回复
string对<<操作符是有重载的,string中有length成员变量记录着string长度,s[4]=0并未改变其长度。
参看:http://blog.csdn.net/yarpee/article/details/6837338
AlwaysToBeZero 2012-03-03
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 bsnry 的回复:]
++


原因是否:string这个类已经重载了<<, 它的机制不是遇到'\0' 就停止输出,,,

否则的话。。。。。。



引用 7 楼 rpk74m 的回复:

如果想中途截断,写入'\0'后可以cout<<s.c_str()<<endl;
[/Quote]

可能吧,这代码用VC编译的话没错,我用的DEV—C++就是我提问的那样了。不知道什么情况。有可能是你说的那样吧。
AlwaysToBeZero 2012-03-03
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 hudesign 的回复:]
感觉你是string类和c风格字符串没有区分开来。c风格字符串才是默认的字符串最后以'\0'结束,而且它的相关函数如strlen等是通过这个结束符来判断访问到字符串末尾的。
[/Quote]

额额额,新手确实没搞明白。
AlwaysToBeZero 2012-03-03
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 yanminhui163 的回复:]
引用 10 楼 alwaystobezero 的回复:
引用 2 楼 yanminhui163 的回复:
效果一样,你再试一下下面的代码:

C/C++ code
#include <iostream>
#include <string>
using namespace std;

int main ()
{
string s ; // char s[255];

cin……
[/Quote]

用VC编译是这样,可是我用的是DEV—C++就是我提问的那样了。
bsnry 2012-03-03
  • 打赏
  • 举报
回复
++


原因是否:string这个类已经重载了<<, 它的机制不是遇到'\0' 就停止输出,,,

否则的话。。。。。。


[Quote=引用 7 楼 rpk74m 的回复:]

如果想中途截断,写入'\0'后可以cout<<s.c_str()<<endl;
[/Quote]
yanminhui163 2012-03-03
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 alwaystobezero 的回复:]
引用 2 楼 yanminhui163 的回复:
效果一样,你再试一下下面的代码:

C/C++ code
#include <iostream>
#include <string>
using namespace std;

int main ()
{
string s ; // char s[255];

cin >> s ;

s[4] = '\0' ;

………
[/Quote]
输出:asdf hjk不会这样输出的,可能你搞错了啦。不信你再试一试。
string s; char s[255]; 两个输出的结果是相同的。不会有一个输出:asdf hjk都是输出:asdf
hudesign 2012-03-03
  • 打赏
  • 举报
回复
感觉你是string类和c风格字符串没有区分开来。c风格字符串才是默认的字符串最后以'\0'结束,而且它的相关函数如strlen等是通过这个结束符来判断访问到字符串末尾的。
AlwaysToBeZero 2012-03-03
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 yanminhui163 的回复:]
效果一样,你再试一下下面的代码:

C/C++ code
#include <iostream>
#include <string>
using namespace std;

int main ()
{
string s ; // char s[255];

cin >> s ;

s[4] = '\0' ;

……
[/Quote]


你这不是跟我的一样吗。
AlwaysToBeZero 2012-03-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ctlg6969 的回复:]
'\0'在C语言里默认是字符串结尾标识,如果把大麦第5行改为:
char s[255];
后面的输出部分使用循环,输出每一个数组元素,就能达到你想要的效果了
[/Quote]

嗯,谢谢,意思是在用string声明的字符串中‘\0’并不表示字符终止,输出时是以空格?
AlwaysToBeZero 2012-03-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ctlg6969 的回复:]
'\0'在C语言里默认是字符串结尾标识,如果把大麦第5行改为:
char s[255];
后面的输出部分使用循环,输出每一个数组元素,就能达到你想要的效果了
[/Quote]

嗯,谢谢,意思是在用string声明的字符串中‘\0’并不表示字符终止,输出时是以空格?
轻机枪 2012-03-03
  • 打赏
  • 举报
回复
如果想中途截断,写入'\0'后可以cout<<s.c_str()<<endl;
ppsharp 2012-03-03
  • 打赏
  • 举报
回复
原来4楼就是你
ctlg6969 2012-03-03
  • 打赏
  • 举报
回复
用4楼的代码实现你想要的功能吧
ctlg6969 2012-03-03
  • 打赏
  • 举报
回复
#include <iostream>
#include <string>

using namespace std;

int main()
{
int i;
char s[255];
std::cin>>s;
for(i=0;i<254;i++)
{
if(s[i]=='\0')
{
break;
}
}
for(;i<254;i++)
{
s[i]='\0';
}
s[4]='\0';
for(i=0;i<255;i++)
{
std::cout<<s[i];
}
std::cout<<std::endl;
system("pause");
return 0;
}
letmegocc 2012-03-03
  • 打赏
  • 举报
回复
+1
自动输出的话,遇到‘\0'就结束了,因为很多函数,都是依靠判断‘\0’来知道字符串是否结束
[Quote=引用 1 楼 ctlg6969 的回复:]
'\0'在C语言里默认是字符串结尾标识,如果把大麦第5行改为:
char s[255];
后面的输出部分使用循环,输出每一个数组元素,就能达到你想要的效果了
[/Quote]
加载更多回复(2)

65,212

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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