【问题标题】:Why push_back() will change the previous value?为什么 push_back() 会改变之前的值?
【发布时间】:2021-05-13 04:52:26
【问题描述】:

我想通过一个for循环构建一系列带有序列号的路径,所以我使用了一系列strcpystrcat(我知道有一个string的方法,但请见谅,我的技术真的很差)。但是在循环之后,我得到了一系列相同的结果。

这是我的代码:

#include <iostream>
#include <io.h>
#include <vector>

vector<char*> TempFilePath;    
char temp[300];
strcpy(temp, EndFilepath);
strcat(temp, "\\Temp");
createDirectory(temp);
char TempFilePathChar[300];
for (int j = 0; j < filevector.size(); j++)
{
    int number = j + 1;
    char TEMPNum[1];
    itoa(number, TEMPNum, 10);
    strcpy(TempFilePathChar, temp);
    strcat(TempFilePathChar, "\\tempData");
    strcat(TempFilePathChar, TEMPNum); 
    strcat(TempFilePathChar, ".tif");
    strcpy(TempFilePathChar, TempFilePathChar);
    TempFilePath.push_back(TempFilePathChar);
}

EndFilepath="E:\\"filevector 的大小是 2。毫无疑问,我想得到流动的结果:

TempFilePath[0]="E:\\Temp\\tempData1.tif"
TempFilePath[1]="E:\\Temp\\tempData2.tif"

但运行后,结果如下:

 TempFilePath[0]="E:\\Temp\\tempData2.tif"
 TempFilePath[1]="E:\\Temp\\tempData2.tif"

谁能告诉我为什么以及如何改变它?

注意:我还是想用vector代替vector,因为我使用网络上的很多函数,它们的返回值和输入值都是char *类型。当然,如果有方法,还是可以达到上述目的的。再次感谢

【问题讨论】:

  • 你没有显示TempFilePath的声明,这对解决你的问题至关重要。我猜应该是vector&lt;char*&gt;,而应该是vector&lt;string&gt;
  • @MarkRansom 对不起,这是我的疏忽。他确实是一个向量。我已经修改了查询。你能告诉我问题是什么
  • 我建议你使用std::vector&lt;std::string&gt; 而不是std::vector&lt;char*&gt;
  • 您只有一个char temp[300]; 缓冲区,向量中存储了多个指针,它们都指向它。所以很自然,向量中的所有指针都指向相同的数据(无论当前在temp 中的什么)
  • 另外你的char TEMPNum[1] 太短了;如果您希望它足够大以存储一个 ASCII 字符,则它至少需要为char TEMPNum[2],这样您就有一个字符用于数字,另一个字符用于保存 NUL 终止符字节。 (如果你想让它存储多于一位的数字,它需要比那个更大)

标签: c++ char push-back


【解决方案1】:

你的向量元素都是相同的指针值,数组地址TempFilePathChar。在您的循环中,您将覆盖该数组的内容,因此您始终获得循环最后一次迭代产生的内容。

【讨论】:

  • 谢谢!我明白了,但我仍然没有办法实现它。你能给我一个修改后的计划吗
  • @Ahri 选择good book 并从头开始学习 C++ 听起来是个不错的计划。您似乎缺少一些基本知识,例如如何使用字符串以及如何创建对象,或者它们的生命周期和范围是什么。
  • 先生,您是对的,我正在这样做。现在我要问才能在没有导师的情况下完成任务(╥﹏╥)
  • 正如之前在 cmets 中所说,我强烈建议使用 vector&lt;string&gt; 而不是 vector&lt;char*&gt;。这将解决您所询问的问题。
猜你喜欢
  • 2020-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-18
  • 2016-06-20
  • 1970-01-01
  • 2012-04-03
相关资源
最近更新 更多