如何在 cin 之后新建一个动态数组
How to new a dynamic array after cin
我正在尝试制作一个包含指针的class,它是动态数组的核心。
如何重载运算符 >> 以便我可以在不知道要放置多少字符的情况下将 >> 指向指针?
我在尝试:
#include <iostream>
class MyString
{
private:
char* str;
size_t length;
public:
//some code here
friend std::istream& operator>>(std::istream& is, const MyString& other)
{
is >> other.str;
return is;
}
}
当我尝试 cin 一个字符串时发生了这种情况:
HEAP CORRUPTION DETECTED
有没有办法读取一个字符串,将其分配给我的字符串,并且不会使用 std::string header?
(我试图制作一个不依赖于 std::string 的字符串 class)
一种天真的实现会使用 is.get()
一次检索一个字符,并将其附加到 other
,并根据需要调整大小。当然,当 std::isspace(chr)
为真时停止。为此,您需要动态分配内存并跟踪在 MyString
.
的实现中您正在使用/可用的内存量 space
这是它的框架;您可能需要实施 append()
方法。
friend std::istream& operator>>(std::istream& is, MyString& other) {
while (true) {
int chr = is.get();
if (is.eof() || std::isspace(chr)) {
break;
}
other.append((char)chr);
}
return is;
}
#include <iostream>
#include <string.h>
class MyString
{
private:
size_t length;
char* str;
void getInput(std::istream&is)
{
char c='[=10=]';
while(c!='\n')
{
is.get(c);
length++;
str=(char*)realloc(str, length);
if(c=='\n')
{
str[length-1]='[=10=]';
}
else{
str[length-1]=c;
}
}
}
public:
MyString()
{
length=0;
str=new char[1];
str[0]='[=10=]';
}
//some code here
friend std::istream& operator>>(std::istream& is, MyString& other)
{
std::cout<<"Enter String: ";
other.getInput(is);
return is;
}
void printString()
{
std::cout<<str<<std::endl;
}
~MyString()
{
delete[]str;
length=0;
}
};
int main()
{
MyString s;
std::cin>>s;
s.printString();
}
我正在尝试制作一个包含指针的class,它是动态数组的核心。 如何重载运算符 >> 以便我可以在不知道要放置多少字符的情况下将 >> 指向指针? 我在尝试:
#include <iostream>
class MyString
{
private:
char* str;
size_t length;
public:
//some code here
friend std::istream& operator>>(std::istream& is, const MyString& other)
{
is >> other.str;
return is;
}
}
当我尝试 cin 一个字符串时发生了这种情况: HEAP CORRUPTION DETECTED
有没有办法读取一个字符串,将其分配给我的字符串,并且不会使用 std::string header? (我试图制作一个不依赖于 std::string 的字符串 class)
一种天真的实现会使用 is.get()
一次检索一个字符,并将其附加到 other
,并根据需要调整大小。当然,当 std::isspace(chr)
为真时停止。为此,您需要动态分配内存并跟踪在 MyString
.
这是它的框架;您可能需要实施 append()
方法。
friend std::istream& operator>>(std::istream& is, MyString& other) {
while (true) {
int chr = is.get();
if (is.eof() || std::isspace(chr)) {
break;
}
other.append((char)chr);
}
return is;
}
#include <iostream>
#include <string.h>
class MyString
{
private:
size_t length;
char* str;
void getInput(std::istream&is)
{
char c='[=10=]';
while(c!='\n')
{
is.get(c);
length++;
str=(char*)realloc(str, length);
if(c=='\n')
{
str[length-1]='[=10=]';
}
else{
str[length-1]=c;
}
}
}
public:
MyString()
{
length=0;
str=new char[1];
str[0]='[=10=]';
}
//some code here
friend std::istream& operator>>(std::istream& is, MyString& other)
{
std::cout<<"Enter String: ";
other.getInput(is);
return is;
}
void printString()
{
std::cout<<str<<std::endl;
}
~MyString()
{
delete[]str;
length=0;
}
};
int main()
{
MyString s;
std::cin>>s;
s.printString();
}