gpt4 book ai didi

c++ - C++:将字符串复制到字符数组时出现问题

转载 作者:行者123 更新时间:2023-12-02 10:19:26 27 4
gpt4 key购买 nike

我正在尝试将文件的内容复制到courseInfo类的字段中。
这是即时通讯使用的代码:

#include<iostream>
#include<fstream>
#include<vector>
#include<sstream>
#include <bits/stdc++.h>

using namespace std;
class courseInfo
{
public:
char courseCode[8];
char courseName[80];
int ECTS;
};

int main()
{
ifstream fin("courses.txt");
if(!fin.is_open())
{
cout<<"file doesn't exist";
return 0;
}
string line;
vector<courseInfo> courses;
while(getline(fin,line))
{
stringstream linestream(line);
string segment;
vector<string> segmentlist;
while(getline(linestream, segment, ';'))
{
segmentlist.push_back(segment);
}
//cout<<segmentlist.at(0).c_str();
courseInfo c;
//segmentlist.at(0).copy(c.courseCode, segmentlist.at(0).size()+1);
//c.courseCode[segmentlist.at(0).size()] = '\0';
strcpy(c.courseCode, segmentlist.at(0).c_str());
cout<<c.courseCode<<"\n;
strcpy(c.courseName, segmentlist.at(1).c_str());
cout<<c.courseCode;
}
return 0;
}


Course.txt文件的内容:

土耳其101;土耳其l; 3。

我得到的输出:

土耳其101

TURK 101土耳其语l

当我将某些内容复制到courseName中时,courseCode的内容会更改。
为什么会这样?
我该如何纠正?

最佳答案

注意TURK 101如何精确为8个字节。
当您cout << c.courseCode时,程序将打印字符,直到遇到NUL字节为止。偶然,c.courseName的第一个字节为NUL。
读完它后,它不再是NUL,因此愉快地打印c.courseCode继续进入c.courseName

一些选项:

  • 最明显(推荐)的解决方案是在结构中使用std::string而不是固定大小的char数组。
    但是,这看起来像是一个家庭作业问题,因此您可能不被允许使用std::string
  • 改用std::vector<char>,但这可能也是不允许的。
  • 使courseCode足够大以包含任何可能的类(class)代码,并为NUL终止符加上一个字符。在这种情况下,请将courseCode设为9个字符。
  • 使用堆分配的内存(new char[str.size()+1]分配char *delete[] ptr稍后释放它)。然后更改courseInfo以使用常规指针。理想情况下,所有内存管理都是在构造函数/析构函数中完成的。参见rule of three/five/zero
  • 关于c++ - C++:将字符串复制到字符数组时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60883449/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com