简单的文本文件格式化在linux下崩溃,但在Windows中很好

Simple text file formatter crashes under Linux, but fine in Windows

本文关键字:崩溃 但在 Windows 很好 linux 文本 文件 格式化 简单      更新时间:2023-10-16

我已经将一个简单的.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]之前,必须执行此操作。

供参考,我通过在各处添加打印并打印所有变量,直到发现它崩溃的位置。

相关文章: