简单的文本文件格式化在linux下崩溃,但在Windows中很好
Simple text file formatter crashes under Linux, but fine in Windows
我已经将一个简单的.ACF文件用于.json文件格式化。但是由于某种原因,它使用MSYS2在Windows的Windows下正确运行 - 但是在执行字符串插入或替换之后,它每次都会分割故障。
它的作用是将以下文件转换为JSON兼容格式。它在每个条目后都附加逗号,应用属性集符号并围绕它放牙套。
另存为test.acf:
"AppState"
{
"appid" "730"
"Universe" "1"
"name" "Counter-Strike: Global Offensive"
"StateFlags" "4"
"installdir" "Counter-Strike Global Offensive"
"LastUpdated" "1462547468"
"UpdateResult" "0"
"SizeOnDisk" "14990577143"
"buildid" "1110931"
"LastOwner" "76561198013962068"
"BytesToDownload" "8768"
"BytesDownloaded" "8768"
"AutoUpdateBehavior" "1"
"AllowOtherDownloadsWhileRunning" "0"
"UserConfig"
{
"Language" "english"
}
"MountedDepots"
{
"731" "205709710082221598"
"734" "5169984513691014102"
}
}
最小主代码和缺陷三重砍伐:
#include <iostream>
#include <fstream>
#include <string>
int main(int argc, char* argv[])
{
file.open("test.acf");
std::string data((std::istreambuf_iterator<char>(file)), (std::istreambuf_iterator<char>()));
int indexQuote = 0;
int index[4];
int insertCommaNext = -1;
string delims = ""{}"; // It skips between braces and quotes only
std::size_t found = data.find_first_of(delims);
while(found != std::string::npos)
{
int inc = 1; // 0-4 depending on the quote - 0"key1" 2"value3" 4{
char c = data.at(found);
if (c != '"') {
if (c == '}')
insertCommaNext = found + 1; // Record index to insert comma after (following closing brace)
else if (c == '{') {
///data.insert(index[1] + 1, ":");
///inc++;
}
indexQuote = 0;
} else {
if (insertCommaNext != -1) {
///data.insert(insertCommaNext, ",");
///inc++;
insertCommaNext = -1;
}
index[indexQuote] = found;
if (indexQuote == 2) { // Join 'key: value' by placing the comma
///data.replace(index[1] + 1, 1, ":");
} else if (indexQuote == 4) { // Add comma after each key/value entry
indexQuote = 0;
///data.insert(index[3] + 1, ",");
///inc++;
}
indexQuote++;
}
found = data.find_first_of(delims, found + inc);
}
data = "{" + data + "}";
}
如果您输入任何三重斜线///行 - 包含插入/替换的行,它将崩溃。
我是代码质量不是很好的,可能还有更好的方法来实现这一目标。欢呼。
问题是 indexQuote
的高于3,因此 index[indexQuote] = found;
脱离界限。您的情况下面是将indexQuote
重置为0的情况,在尝试调用index[indexQuote]
之前,必须执行此操作。
供参考,我通过在各处添加打印并打印所有变量,直到发现它崩溃的位置。
相关文章:
- C++ Python 模块在 Blender 中崩溃,但在 Python 控制台中不会崩溃
- Mac os x app bundle 在下载并运行时崩溃,但在终端或更改 Info.plist 时运行良好
- 在C++中调用 free() 会触发 ntdll!DbgBreakPoint() 在调试中,但在发布中崩溃
- C++ rezing 动态数组最多可以处理一定数量的元素,但在某些时候会崩溃并显示错误 (0XC0000005)
- 简单的文本文件格式化在linux下崩溃,但在Windows中很好
- cv::split() 在至强处理器上崩溃,但在其他地方工作
- "Unable to open file libc++abi.dylib" .程序生成,但在运行时崩溃。使用 xcode 10.1 (10B61)
- 一般来说,使用Qt Creator,是什么导致程序在调试模式下编译时正确运行,但在发布模式下崩溃
- 我的程序在Windows机器上崩溃了,但在Linux上运行良好
- 为什么对齐的参数编译正确,但在运行时崩溃
- DBUS 代码在放置在守护进程内时崩溃,但在没有守护进程代码的独立独立 main() 函数中运行良好
- 在 Xcode 6 中运行 cpp-netlib - 编译但在运行时崩溃
- 为什么我的.exe文件崩溃了,但在调试和发布版本中工作得很好
- Simplecrypt让我的QT应用程序在OS X Mountain Lion上崩溃,但在Windows上完美运行
- 非常简单的C++代码在Android上崩溃,但在OS X上运行良好
- 为什么在VS 2010 C++中,我的程序在调试器中运行良好时会崩溃,但在没有调试器的情况下运行时会崩溃
- OpenCV简单代码编译成功,但在运行时崩溃
- GLEW编译,但在运行时崩溃
- openCV程序可编译,但在运行时崩溃
- 在发布模式下崩溃但在调试模式下不崩溃的 ActiveX 控件