【问题标题】:How to add the last element into a vector of a struct containing an array in c++如何将最后一个元素添加到包含c ++中数组的结构的向量中
【发布时间】:2025-12-30 21:50:06
【问题描述】:

您好,我想将最后一个元素添加到包含数组的结构向量中。我试图将它添加到它的循环下,但是常量字符有问题。它说“从‘const char*’到char的无效转换”[-fpermissive]

我的这个文件名为myfile.txt.log

id  value 
1   ABC  
2   BDV  
3   COO  
4   DDC  
5   EEE  
6   FGE  
7   GTW  
8   HFE  
9   IOO  
10  KPP  

期望的输出:

vector size: 11 
vector content: ABC 
vector content: BDV 
vector content: COO 
vector content: DDC 
vector content: EEE 
vector content: FGE 
vector content: GTW 
vector content: HFE 
vector content: IOO 
vector content: KPP 
vector content: XXX 

这是我的代码。任何输入都会很棒!我在 C++ 98 上

#include <iostream>
#include <cstring>
#include <vector>

using namespace std;

struct V {
  char a[10];
};

int main() {
   
  FILE * pFile;
  char mystring [100];
  int i;
  char str[3];
  char strCp[3];
  vector<V> input;
 
  pFile = fopen ("/uploads/myfile.txt.log" , "r");
  if (pFile == NULL) perror ("Error opening file");
  else {
    while ( fgets (mystring , 100 , pFile) != NULL )
    {
      sscanf(mystring, "%d %s", &i, str);
      strncpy(strCp, str, 3);
      //puts(strCp);
      
      V v;
      int size = sizeof(strCp)/sizeof(strCp[0]);
      for ( unsigned int a = 0; a < size; a++ )
      {
        v.a[a] = strCp[a];
        v.a[a-1] = "XXX";
      }
      
      // Set vector
      input.push_back(v);

    }
    
    //Vector Output
    cout << "vector size: " << input.size() << endl;
    vector<V>::iterator it;
    for ( it = input.begin(); it != input.end(); it++ )
    {
      cout << "vector content: " << it->a << endl;
    }

    fclose (pFile);
   }
   
   return 0;
}

   

【问题讨论】:

  • 您希望向量大小为 12,但您的列表只有 11 项。你能详细说明吗?还是您的意思是包含 11 个项目的向量?
  • 请记住,C 字符串是 以空值结尾的。三个字符的字符串需要 四个 字符的空间以包含空终止符。由于您没有该空间,因此您的程序在构建后将具有未定义的行为。您的代码中还存在许多其他问题,包括但不限于您使用的所有 C 功能。即使您使用的是仅支持 C++98 标准的旧编译器,您仍然有 C++ 文件流和用于字符串的 std::string
  • 至于您的问题,我假设您在v.a[a-1] = "XXX"; 收到错误?那应该做什么?也许您需要退后一步,投资some good books 并重新开始学习 C++ 的基础知识。
  • 是的,我有错误。只是希望简单的 push_back 但它在一个结构中。我只想再添加一个元素作为最后一个元素。
  • @selbie 我已更正为 11 号

标签: c++ c++98


【解决方案1】:

考虑使用比 C 更多的 C++ 语义:

#include <iostream>
#include <fstream>
#include <vector>
#include <string>

using namespace std;

struct V {
    char a[10];
};

int main()
{
    std::vector<V> input;
    std::string s;
    int count = 0;
    while (std::cin >> s)
    {
        count++;
        if ((count % 2) == 0)
        {
            V v = {};
            strncpy(v.a, s.c_str(), 4);
            input.push_back(v);
        }
    }

    V endV = {};
    strncpy(endV.a, "XXX", 4);
    input.push_back(endV);

    fstream logfile;
    logfile.open("logfile.txt", std::ios_base::out);
    if (logfile.is_open())
    {
        for (size_t i = 0; i < input.size(); i++)
        {
            logfile << input[i].a << "\n";
        }
        logfile.close();
    }

    return 0;

}

【讨论】:

  • @PKramer 所有 c++ 标准都支持 std::vector&lt;T&gt;std::string,就像 c++98 一样
  • 好吧,我对 c++98 的看法是正确的 :)
  • 非常感谢@selbie,如此简单的修复工作! 'V endV = {}; strncpy(endV.a, "XXX", 4); input.push_back(endV);'
  • 是的 c++98 老派别无选择,希望是 c++ 11