【问题标题】:Why is my global variable vector not storing my data?为什么我的全局变量向量不存储我的数据?
【发布时间】:2026-02-12 05:45:01
【问题描述】:

我阅读了一个包含 "," 分隔词的文本文件。

我逐行阅读这个文件。

取一行后,我使用 split 函数将其拆分为单词。在这里,我使用 ',' 来表示行中的单独单词。

我定义了一个全局向量,所以我认为我可以将所有单词存储在该向量中。

在向量从分割函数中出来之前一切正常。

代码运行良好。但它不会将单词存储在向量中。

在 split 函数的底部你可以看到我写的那行。 cout<<evec.size()<<endl;那一行是逐行检查向量的大小。

如果第一行有 13 个逗号分隔的单词,则显示 13(这意味着它存储了它)

但是一旦您退出拆分功能,该数据就不再可用。我该怎么做才能将所有单词存储在这个向量中?

#include<iostream>
#include<string>
#include<stdio.h>
#include <fstream>
#include <vector>

using namespace std;

std::vector<string> evec;


void split( string st,vector<string> evec){
   string z = " ";
   for ( char s : st){
      if ( s==','){
        evec.push_back(z);
         z = " ";
      }
      else{
         z = z + s;
      }
   }
   cout<<evec.size()<<endl;

}

int main( ){
string st;
ifstream Myfile("file.txt");
   while(getline(Myfile, st))
{
    split(st,evec);
    
}
    cout<< evec.size() <<endl;
    for (auto& it : evec) {
        cout << it << endl;
    }
   return 0;
}

【问题讨论】:

  • vector&lt;string&gt; evec 是原始向量的副本。原始向量没有被修改。学习 C++ 中的参考资料。
  • 如果您不知道按值、按指针和按引用传递函数参数的区别,我建议您查阅您最喜欢的 C++ 书籍。或者,您可以查看在线教程中的以下链接:1.Call by Value 2.Call by pointer 3.Call by reference
  • 要通过参数访问局部变量,请使用evec。要访问全局变量,请使用::evec

标签: c++ visual-c++ c++17


【解决方案1】:
void split( string st,vector<string> evec){

split() 函数的第二个参数称为evec。无论如何,它与恰好具有相同名称的全局变量完全无关。仅仅因为它与全局变量同名并不意味着它是同一个对象,它不是。

此外,它通过值传递给这个函数。此函数更改其evec 参数。 “按值”意味着,实际上,此参数是传递给此函数的原始参数的副本,对此参数的任何更改都不会影响传入的对象,它只是一个独立的副本。

根据定义,“全局变量”不需要传递给函数。它是全球可访问的。只需从此函数中删除此参数即可。

另一方面,如果您不想使用全局变量,则需要采用不同的方法。但是你说全局变量是故意的。

【讨论】:

  • @ThishanDharmakeerthi 如果这解决了您的问题,请按左侧的复选标记将您的问题标记为已解决。