gpt4 book ai didi

c - 改进我的 C 风格字符串使用

转载 作者:行者123 更新时间:2023-12-04 11:32:24 25 4
gpt4 key购买 nike

我修改 Valve 游戏已经有一段时间了,但我最不擅长的是使用 char 数组来操作字符串。考虑到我在他们身上浪费了多少时间,我真的很想改进。显然使用适当的字符串会很好,但由于所有 SDK 函数都返回 char *,或将其作为 args,因此转换回来和第四次后并没有多大用处。就更好地理解它们而言,有没有人有任何好的联系?我在 Google 上找到的大部分内容只是片段。

此外,我正在尝试解析一个非常简单的文本文件。基本上内容是这样的……

补丁版本=1.1.1.2产品名称=l4dappID=440

我想获取 PatchVersion 和 ProductName。我的代码看起来像这样,但实际上只是缺乏适当的知识让我感到难过。 strtok 只检索 '=' 符号之前的标记,strchr 给了我一个指向它位置的指针,但就是不知道一个好的方法。

bool ParseSteamFile()
{
FileHandle_t file;
file = filesystem->Open("steam.inf", "r", "MOD");

if(file)
{
int size = filesystem->Size(file);
char *line = new char[size + 1];

while(!filesystem->EndOfFile(file))
{
char *subLine = filesystem->ReadLine(line, size, file);
Msg("SUBLINE: %s\n", subLine);

char *buffer = "";

if(strstr(subLine, "PatchVersion"))
{
char *c = strtok(subLine, "=");
while(c != NULL)
{
Msg("Token: %s\n", c);
c = strtok(subLine, "=");
}
}
}
}
}

最佳答案

使用 C 字符串没有任何问题。然而,它需要您编写相当多的非常低级的代码,这些代码在使用 String 对象时已经被抽象掉了。

一般来说,C 字符串只是一个字节数组(每个字节对应一个字符的 ascii 值),末尾有一个空字节。然而,命令的实际语法可能有点深奥,我推荐 cplusplus.com 作为引用。

您对 strtok 的第二次调用需要用 null 调用,而不是再次调用 subLine:

      char *c = strtok(subLine, "=");
while(c != NULL)
{
Msg("Token: %s\n", c);
c = strtok(null, "=");
}

目前你正在用等号标记,所以你最终会得到:

PatchVersion
=1.1.1.2 ProductName
=l4d appID
=440

不要忘记 strtok 会消耗输入字符串,因此循环结束后 subLine 将为空。

我会首先用空格标记字符串以获取每个键值对。然后我会将每个键值对拆分为其组成元素并存储所需的元素。 (s)scanf 函数可以很好地完成这种类型的解析。将一对读入 namevalue:

char * name = new char[255];
char * value = new char[255];
sscanf(subLine, "%s=%s", name, value);

然后您可以使用 strncpy 将值复制到适当的位置。 sscanf 不消耗输入,因此后续调用必须将 subLine 的指针移到上一个匹配项之外(或者在格式表达式中使用三个 %s=%s 对,以及三个名称和值变量对,如果您知道总会有三个)。

重要的是让您的应用程序代码尽可能远离低级操作。如果您经常进行此类操作,那么查找或创建一个库来解析此类文件可能是一个好(且有趣)的主意。

关于c - 改进我的 C 风格字符串使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4102442/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com