如何解决为什么我的循环无法检测到 const 字符串中的 \0 符号?
#include<iostream>
#include<string>
#include<sstream>
#include <typeinfo>
#include<cmath>
#include<vector>
#include <algorithm>
using namespace std;
class Mystring {
char *arr;
public:
Mystring(const char pointer[]) {
int i = 0;
while (pointer[i] != '\0') {
i++;
cout << pointer[i] << endl;
}
arr = new char[i];
i = 0;
while (pointer[i] != '\0') {
arr[i] = pointer[i];
i++;
}
}
friend ostream& operator<<(ostream& out,Mystring& str) {
int i = 0;
while (str.arr[i] != '\0') {
out << str.arr[i];
i++;
}
return out;
}
};
int main() {
Mystring string("Hello,world!");
cout << string << endl;
}
我正在尝试创建自己的字符串类。 “hello world!”的长度是 13,但结果 arr 的长度是 17。出于某种我不明白的原因,它充满了一些奇怪的字符。当我尝试 cout 字符串时,它返回:Hello,world!¤¤¤¤.
解决方法
您忘记在 '\0'
末尾添加 arr[]
。
此外,如@user7860670 的回答中所述,应增加大小或 arr
以包含此 \0
。
此外,使用 string
作为变量名,除了 using namespace std;
之外,至少会造成混淆。
#include<iostream>
#include<string>
#include<sstream>
#include <typeinfo>
#include<cmath>
#include<vector>
#include <algorithm>
//using namespace std;
class Mystring {
char *arr;
public:
Mystring(const char pointer[]) {
int i = 0;
while (pointer[i] != '\0') {
i++;
std::cout << pointer[i] << std::endl;
}
arr = new char[i+1];
i = 0;
while (pointer[i] != '\0') {
arr[i] = pointer[i];
i++;
}
arr[i] = '\0';
}
friend std::ostream& operator<<(std::ostream& out,const Mystring& str) {
int i = 0;
while (str.arr[i] != '\0') {
out << str.arr[i];
i++;
}
return out;
}
};
int main() {
Mystring mstring("Hello,world!");
std::cout << mstring << std::endl;
}
,
保存 "Hello,world!"
(包括终止空值)所需的缓冲区大小为 14,而您仅为 13 个字符分配空间并完全省略终止空值。因此,在 operator<<
缓冲区内的迭代期间,索引将超出边界,这是未定义的行为。
你应该分配一个额外的字节并确保缓冲区以终止空值结束
arr = new char[i + 1];
i = 0;
while (pointer[i] != '\0')
{
arr[i] = pointer[i];
++i;
}
arr[i] = '\0';
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。