C++ 在传递给函数时,如何正确地将一个字符数组的内容复制到另一个字符数组中,而不使用STL?
我想学习如何将一个字符串的内容复制到另一个字符串中,并确保我对代码的解释是正确的。这个练习的重点是学习,所以我不想使用STL实现——我想自己学习算法 我有一个名为CStudent的类,它包含一个名为szName的私有成员变量 在Main.cpp中,我有一些代码使用getLine读取一行数据,并使用自定义substr函数提取一定数量的字符 我想将szName的内容设置为substr函数的结果,但迄今为止我尝试的每个实现都只会导致复制一个字符 以下是代码的相关部分:C++ 在传递给函数时,如何正确地将一个字符数组的内容复制到另一个字符数组中,而不使用STL?,c++,arrays,char,C++,Arrays,Char,我想学习如何将一个字符串的内容复制到另一个字符串中,并确保我对代码的解释是正确的。这个练习的重点是学习,所以我不想使用STL实现——我想自己学习算法 我有一个名为CStudent的类,它包含一个名为szName的私有成员变量 在Main.cpp中,我有一些代码使用getLine读取一行数据,并使用自定义substr函数提取一定数量的字符 我想将szName的内容设置为substr函数的结果,但迄今为止我尝试的每个实现都只会导致复制一个字符 以下是代码的相关部分: class CStudent {
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> <代码>只复制一个字符?你如何观察?esetName
的结果是什么?我忍不住注意到getName()
被不合理地声明为返回单个字符
-这可能是您困惑的根源吗?在您的substr
函数中,为什么您的for条件是inStringPos
?您不希望复制endPos
处的字符?谢谢您的询问。我知道substr可以工作,因为如果我通过我的程序,在substr的一次迭代完成后,sName变量确实包含Visual Studio调试器提供的正确信息。