gpt4 book ai didi

c - 在 C 中将字符串解析为 typedef 结构

转载 作者:行者123 更新时间:2023-11-30 18:42:11 26 4
gpt4 key购买 nike

如何将包含字符和数字的文件中的字符串解析为 typedef 结构。

这两行是需要解析的数据示例:

Pebbles Flintstone4Female
Bam-Bam Rubble3Male

首先是姓名,然后是空格,最后是姓氏,然后是年龄和性别。

姓名、年龄和性别是需要存储的 typedef 的一部分。

.txt 文件中总共存储了 7 个与上面两个类似的字符串。

如何编写正确的缓冲区来分隔字符串?

这就是我到目前为止所得到的

sscanf(buffer, "%[^ ]%*[^1234567890]%d%s", buff_name, buff_surname, buff_age, buff_gender);

但它似乎无法正常工作,我无法访问有关它的任何信息。

最佳答案

  1. 始终检查 sscanf() 及其相关函数的返回值。
  2. 务必启用编译器警告。一个好的编译器会告诉你下一个问题:
  3. 当您希望读取姓氏时,请勿使用 %*[0-9] 中的 * 抑制赋值。

请注意,您的 sscanf() 行不使用您提到的数据结构。但是,此示例代码可以:

#include <stdio.h>

typedef struct who
{
char name[20];
char surname[20];
int age;
char gender[7];
} who;

int main(void)
{
const char *data[2] =
{
"Pebbles Flintstone4Female",
"Bam-Bam Rubble3Male",
};
const char *fmt[2] =
{
"%[^ ]%*[^1234567890]%d%s",
"%[^ ]%[^1234567890]%d%s",
};

for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 2; j++)
{
who buff;
int n;
if ((n = sscanf(data[j], fmt[i], buff.name, buff.surname, &buff.age, buff.gender)) != 4)
printf("Oops: format \"%s\", n = %d: %s\n", fmt[i], n, data[j]);
else
printf("Format \"%s\": data %s: %s %s %d %s\n",
fmt[i], data[j], buff.name, buff.surname, buff.age, buff.gender);
}
}
return 0;
}

示例输出:

Oops: format "%[^ ]%*[^1234567890]%d%s", n = 3: Pebbles Flintstone4Female
Oops: format "%[^ ]%*[^1234567890]%d%s", n = 3: Bam-Bam Rubble3Male
Format "%[^ ]%[^1234567890]%d%s": data Pebbles Flintstone4Female: Pebbles Flintstone 4 Female
Format "%[^ ]%[^1234567890]%d%s": data Bam-Bam Rubble3Male: Bam-Bam Rubble 3 Male

如果您使用 sscanf() 格式的字符串文字进行编译,GCC 会警告您有关该问题的信息:

td.c: In function ‘main’:
td.c:23: warning: format ‘%d’ expects type ‘int *’, but argument 4 has type ‘char *’
td.c:23: warning: format ‘%s’ expects type ‘char *’, but argument 5 has type ‘int *’
td.c:23: warning: too many arguments for format

上面具有不同格式字符串的代码无法向您发出该警告。

格式字符串也应该修改以避免缓冲区溢出:

"%19[^ ] %19[^0-9] %d %6s"

关于c - 在 C 中将字符串解析为 typedef 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17985735/

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