将std::字符串放入char[][]数组中
Putting an std::string into a char[][] array
所以我试图创建一个Befunge interporter并将文本文件读取到数组中。我使用的是这个代码:
char map[100][100]; //not 85 x 20
//load the source
ifstream f;
f.open("file.txt", ios::in);
string s;
int i = 0;
while(f.good() && i < 100)
{
getline(f, s);
map[i] = s.c_str();
i++;
}
这不起作用,有人知道一种不用手动循环字符串的方法吗?
使用strncpy()
并指定字节数:
strncpy(map[i], s.c_str(), 100);
map[i][99] = ' '; /* this could trim s.c_str(), but at least you don't get an overflow */
而不是:
map[i] = s.c_str();
通过指定复制的字节数最多为100
,可以确保不会溢出map[i]
。如果strlen(s.c_str()) < 100
,则strncpy()
功能将用终止符填充map[i]
。在strlen(s.c_str()) >= 100
的情况下,字符串将被截断,以便为map[i]
提供必要的空终止符。
我认为这样做更安全
char* map[100];
....
while(f.good() && i < 100)
{
getline(f, s);
map[i] = new char[s.length() + 1];
strcpy (map[i], s.c_str());
i++;
}
与这里已经发布的其他答案相反,您不应该试图使用strcpy复制到"map"中。在进行任何复制之前,您需要确保不会溢出缓冲区。为此,不应使用源的大小,而应使用目标的大小。原因是源可能比目标的空间更长。为了避免在你做了其他事情之前可能不会出现的问题密集的计算,你应该确保你不会试图复制到一个不足以容纳你试图复制到其中的内容的目的地。
这是用于复制字符串的函数签名(好吧,您应该在这里使用的签名):
strncpy(dest, source, size);
以下是您应该使用的内容:
strncpy(map[i], s.c_str(), sizeof(map[i]));
编辑:
或者,您可以使用strncpy_s()(如果您在Windows上!),它允许您指定源和目标长度。
strncpy_s(dest, dest_size, source, source_size)