C++ 在传递给函数时,如何正确地将一个字符数组的内容复制到另一个字符数组中,而不使用STL?

C++ 在传递给函数时,如何正确地将一个字符数组的内容复制到另一个字符数组中,而不使用STL?,c++,arrays,char,C++,Arrays,Char,我想学习如何将一个字符串的内容复制到另一个字符串中,并确保我对代码的解释是正确的。这个练习的重点是学习,所以我不想使用STL实现——我想自己学习算法 我有一个名为CStudent的类,它包含一个名为szName的私有成员变量 在Main.cpp中,我有一些代码使用getLine读取一行数据,并使用自定义substr函数提取一定数量的字符 我想将szName的内容设置为substr函数的结果,但迄今为止我尝试的每个实现都只会导致复制一个字符 以下是代码的相关部分: class CStudent {

我想学习如何将一个字符串的内容复制到另一个字符串中,并确保我对代码的解释是正确的。这个练习的重点是学习,所以我不想使用STL实现——我想自己学习算法

我有一个名为CStudent的类,它包含一个名为szName的私有成员变量

在Main.cpp中,我有一些代码使用getLine读取一行数据,并使用自定义substr函数提取一定数量的字符

我想将szName的内容设置为substr函数的结果,但迄今为止我尝试的每个实现都只会导致复制一个字符

以下是代码的相关部分:

class CStudent
{
public:
    void setName(char inName[]);
    void setClass(char inClass[]);
    void setGPA(float inFloat);
    char getName();
    char getClass();
    float getGPA();

private:
    char szName[20] = {};
    char szClass[10] = {};
    float fGPA{ -1.0f };
};

// Custom strcpy to enable use of setters in class
void strcpy(char inString[], char outString[], size_t outSize)
{
    unsigned int i = 0;
    for (; ((inString[i] != '\0') && (i < (outSize))); i++)
    {
        outString[i] = inString[i];
    }
    outString[i] = '\0';

}

void CStudent::setName(char inName[])
{
    strcpy(inName, szName, 20);
}

// Custom substr to enable use of setters in class
void substr(char inString[], char outString[], size_t outSize, int startPos, int endPos)
{
    int inStringPos = 0, outStringPos = 0;

    //for (inStringPos = startPos, outStringPos = 0; outStringPos < outSize;)
    for (inStringPos = startPos, outStringPos = 0; inStringPos < endPos;)
    {
        outString[outStringPos++] = inString[inStringPos++];
    }
    outString[outStringPos] = '\0';

}
class-CStudent
{
公众:
void setName(char inName[]);
void setClass(char inClass[]);
void setGPA(浮动入浮);
char getName();
char getClass();
float getGPA();
私人:
char szName[20]={};
char szClass[10]={};
浮动fGPA{-1.0f};
};
//自定义strcpy以支持在类中使用setter
空字符串(字符装入[],字符伸出[],大小不超过)
{
无符号整数i=0;
对于(;((inString[i]!='\0')&(i<(超大));i++)
{
伸出的,伸出的;
}
突出的[i]='\0';
}
void CStudent::setName(char inName[]
{
strcpy(inName,szName,20);
}
//自定义substr以允许在类中使用setter
无效子字符串(字符插入[],字符伸出[],大小超大号,内部起始位置,内部结束位置)
{
int inStringPos=0,outStringPos=0;
//对于(inStringPos=startPos,outStringPos=0;outStringPos
主要摘录:

int main()
{
    CStudent students[25]{};
    CStudent freshmen[25]{};
    CStudent sophomores[25]{};
    CStudent juniors[25]{};
    CStudent seniors[25]{};

    // Read in data
    fstream inputFile;
    inputFile.open("input.txt");

    for (int i = 0; i < 25; i++)
    {
        char readLine[80] {};
        inputFile.getline(readLine, 80);

        char sName[20] {};
        substr(readLine, sName, 20, 0, 19);  // Only reading first character
        students[i].setName(sName);

        char sClass[10] {};
        substr(readLine, sClass, 10, 20, 29);
        students[i].setClass(sClass);
intmain()
{
学生[25]{};
CST新生[25]{};
CST大二学生[25]{};
CST三年级学生[25]{};
学生高年级[25]{};
//读入数据
fstream输入文件;
open(“input.txt”);
对于(int i=0;i<25;i++)
{
字符读取行[80]{};
getline(readLine,80);
charsname[20]{};
substr(readLine,sName,20,0,19);//仅读取第一个字符
学生[i].setName(sName);
char-sClass[10]{};
substr(读线、sClass、10、20、29);
学生[i].setClass(sClass);
我哪里出了问题

我阅读了在多个地方发现的strcpy的实现,但我似乎不知道哪里出了问题


编辑:在代码注释中,我提到substr只返回1个字符,但它实际上是setter-setName。

我错误地将getName的返回类型设置为char,而不是char*,char*,char*正确地只返回数组的第一个字符。谢谢@IgorTandetnik。

有一个未使用的
超大
arg我想,你应该检查请求的子串的长度是否小于超大容量。你无论如何都不想使用它,你可能不打算使用C++标准库的特性。但是你不知道哪些是你想排除的。你认为什么是代码> > StEng> <代码>只复制一个字符?你如何观察?e
setName
的结果是什么?我忍不住注意到
getName()
被不合理地声明为返回单个
字符
-这可能是您困惑的根源吗?在您的
substr
函数中,为什么您的for条件是
inStringPos
?您不希望复制
endPos
处的字符?谢谢您的询问。我知道substr可以工作,因为如果我通过我的程序,在substr的一次迭代完成后,sName变量确实包含Visual Studio调试器提供的正确信息。