C++中for循环中的cout重写自身

7
这个for循环中的cout语句:
for (vector<Student>::iterator qw = students.begin(); qw != students.end(); ++qw){
    Student a = *qw;
    name = a.getName();
    regno = a.getRegNo();
    std::cout << "Name: "<< name << " Reg Number: " << regno << endl;
}

创建一些奇怪的行为,cout 应该打印出以下内容: “Name: Mike Sanderson Reg Number: 10101”
然而实际上它打印出了以下内容: “Reg Number: 10101on”
在我看来,在第二部分 cout 语句之后,它返回到行的开头并覆盖自己,但为什么呢? 希望你们能帮助我,如果需要更多信息,请让我知道!

2
Student里面不会有一个指针分配了动态内存而没有遵循三法则,对吗? - chris
1
name是什么类型?a.getName()返回什么?(在cout行之前设置一个调试断点,查看nameregno中的内容。) - David Schwartz
@DavidSchwartz 是的,我应该把那个放进去,抱歉,名称是一个std::string,a.getName()返回一个std::string。 - DevWithZachary
1个回答

17

这是回车字符的作用(即字符串字面量中的\r)。我假设name字符串末尾有一个\r。您需要找出它是怎么出现的,并将其删除。

我猜您可能是从文件中读取了这些名称,而该文件是在Windows上创建的,默认情况下以\r\n结尾。当从文本文件中读取时,C++通常会自动处理换行符之间的转换,但如果您正在将文件作为二进制文件读取并使用\n作为分隔符,则会遇到此问题。将会将\r读取为行的一部分。


1
我认为这是由于我的评论而随机记忆中出现的 :p - chris
谢谢,我会看一下的。虽然不应该出问题,但有时候奇怪的事情也会发生。 - DevWithZachary
1
@ZacPowell 你是从文件中读取的名称吗?你在使用Windows系统吗? - Joseph Mansfield
@sftrabbit,思维敏捷,这很有可能。 - chris
@sftrabbit 是的,我正在从文件中读取名称,并且(可悲的是)我正在使用Windows。在从名称字符串中删除最后一个字符后,它完美地工作了,所以我猜它确实是一个回车符。谢谢,否则我将再花费2个多小时寻找错误。 - DevWithZachary

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接