我正在尝试使用“&”分隔的值来获取连续的行加载到多维数组中。这是我尝试这样做的方式 - 一切都在代码中检出,除了字符串“str”,它包含我的分隔值,格式为“value1,value2,value3等...”只是将整个字符串加载到阵列[0] [0]。我知道有更好的方法可以做到这一点,但我想知道的是为什么C ++不会将“str”视为输入单个值和硬编码“数组”。
以下是代码:
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
int main(int argc, char* argv[])
{
string str, strTotal;
ifstream in;
in.open("Desktop/01_001.PAC");
getline(in,str);
while ( in ) {
strTotal += str;
getline(in,str);
}
string searchString( "&" );
string replaceString( ", " );
assert( searchString != replaceString );
string::size_type pos = 0;
while ( (pos = str.find(searchString, pos)) != string::npos ) {
str.replace( pos, searchString.size(), replaceString );
pos++;
}
string array[4][5] = {str};
cout << array[0][0];
return(0);
}
这是外部文件("Desktop/01_001.PAC"
):
void&void&void&void&a&a1&a2&a3&b&b1&b2&b3&c&c1&c2&c3&d&d1&d2&d3
提前致谢!
答案 0 :(得分:0)
如果我正确地读取您的代码,您似乎正在搜索字符串(从文件加载),并且只将最后一个结果分配给数组索引(x = 4,y = 5)。所以你的代码做了这样的事情:
while (have not found last variable)
search for next variable in string
assign variable to (4,5) in matrix
所以最后的赋值甚至可以工作,但是因为你只在最后分配,所以数组不会按照我认为你希望它被填充的方式填充。
我将假设您想要的矩阵总是相同的大小,否则事情会变得更复杂。在这种情况下,您可以使用以下内容:
let xMax = 4
let yMax = 5
for (x from 0 to xMax)
for (y from 0 to yMax)
find the next variable in the string
assign it to the current (x,y) location in matrix
调试语句是你的朋友!尝试上述解决方案而不将其保存到数组中,而是打印出每个术语,看看它是否正常工作。
我还要指出字符串“void”不是C ++关键字void,因此如果您希望数组索引为void,则无效。尝试让代码在没有空洞的情况下正常工作。
答案 1 :(得分:0)
因为代码和数据是不同的东西。您的代码在运行之前已经过编译。
听起来好像这就是你所期望的:
该字符串包含文本“foo,bar,baz”。
语句string[] whatever = {str};
已运行。
由于“str”包含“foo,bar,baz”,您希望它具有相同的效果,就像代码行实际上是 string[] whatever = {"foo", "bar", "baz"}
一样。
这样的问题意味着对编程的工作原理完全存在误解。
在C ++中,这种神奇的东西都不会发生。它不能,因为(a)如果你真的想把'str'放入数组呢? (b)如果'foo','bar'和'baz'也是你程序中的变量怎么办 - 它们是否应该以相同的方式解释?
变量名称不是文本。出于所有实际目的,它们在您的代码运行时不再存在。它们只是存在,所以你作为程序员可以说“在这里使用的值应该与那里使用的”相同。
此外,C ++ 中的数组初始化并不关心初始化中实际有多少元素与数组的声明大小。任何其他元素都将默认初始化(即,分配空字符串)。
字符串不能被视为字符串数组,因为它不是一个。如果你想要一个字符串数组,那么在你确定它们时使用各个字符串元素来构建它。
但由于您事先并不知道有多少元素,因此您应该使用std::vector
而不是数组。为什么要尝试将数据排列成二维结构?你怎么能想知道它应该有多“广泛”?