0

readFruit.nameNULL在我尝试将其初始化为 char 数组之前已初始化。我包括size看看这是否是罪魁祸首,但这正是它应该取决于我的输入。无论长度tempString是多少,readFruit.name都会在内存中分配大约 25 个“字符”,它们都是垃圾。为什么它没有被分配一个大小的空间,tempString.length()我该如何修复它?

相关的 CPP

std::istream & operator>>(std::istream &is, Fruit &readFruit)
{

string tempString;
is >> tempString;
int size = tempString.length();
readFruit.name = new char[tempString.length()];
for(int i = 0; i < (int)tempString.length(); i++)
{
    readFruit.name[i] = tempString[i];
}
for(int i =0; i < CODE_LEN; i++)
{
    is >> readFruit.code[i];
}
return is;
}

相关H文件(构造函数)

#ifndef _FRUIT_H
#define _FRUIT_H
#include <cstring>
#include <sstream>
#include <iomanip>
#include <iostream>
enum { CODE_LEN = 4 }; 
enum { MAX_NAME_LEN = 30 };
class Fruit
{
private:
    char *name;
    char code[CODE_LEN];
public:
    Fruit(const Fruit &temp);
    Fruit(){name = NULL;};
    bool operator<(const Fruit& tempFruit);
    friend std::ostream & operator<<(std::ostream &os, const Fruit& printFruit);
    bool operator==(const Fruit& other){return *name == *other.name;};
    bool operator!=(const Fruit& other){return *name != *other.name;};
    friend std::istream & operator>>(std::istream& is, Fruit& readFruit);
};
#endif
4

2 回答 2

4

如果您尝试打印readFruit.name,它将显示垃圾值,直到找到空终止,这就是我假设您说的 25 个字符“所有垃圾

像这样分配内存:

readFruit.name = new char[tempString.length()+1];

for循环之后:

readFruit.name[i] ='\0'; // C strings are null terminated

于 2013-10-04T12:09:58.517 回答
3

要解决您的问题,您需要对name字符数组进行空终止。现在您复制了所有字符,但您需要在末尾有一个二进制零字符才能使所有字符串函数正常工作。所以你需要再分配一个字符并写入一个'\0'

那就是说:使用std::string你的水果的名字。没有理由通过使用字符数组来帮助自己解决大量自制错误。

于 2013-10-04T12:07:00.403 回答