gpt4 book ai didi

c - 分割长字符串

转载 作者:行者123 更新时间:2023-11-30 14:48:04 25 4
gpt4 key购买 nike

我有一个存档 results.csv,我需要读取该存档的前两行,拆分第二行并将其打印在 output.txt 上。不知怎的,它没有打印任何东西,但我不知道原因。

我没有添加我确信没问题的功能。

命令:a.c results.csv

第一行:日期、home_team、away_team、home_score、away_score、锦标赛、城市、国家、中立

第二行:18721130,苏格兰,英格兰,0,0,友好,格拉斯哥,苏格兰,FALSE

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>

typedef struct
{
char *line1;
long int date;
char *h_team;
char *a_team;
int gols_h_team;
int gols_a_team;
char *reason;
char *city;
char *country;
char *neutral_field;

}Data;

void alloc_Data(Data *d, int size)
{
d->line1 = (char*)malloc(50*sizeof(char));
d->h_team = (char*)malloc(30*sizeof(char));
d->a_team = (char*)malloc(30*sizeof(char));
d->reason = (char*)malloc(30*sizeof(char));
d->city = (char*)malloc(30*sizeof(char));
d->country = (char*)malloc(30*sizeof(char));
d->neutral_field = (char*)malloc(9*sizeof(char));
}

void store(Data *d, FILE *input, FILE *output, int size)
{

fscanf(input, "%s", d[0].line1);
fprintf(output, "%s\n", d[0].line1);

for(int i = 1; i < size; i++)
{
fscanf(input, "%li,%[^,]s%[^,]s%d,%d,%[^,]s%[^,]s%[^,]s%[^,]s", &d[i].date, d[i].h_team, d[i].a_team, &d[i].gols_h_team, &d[i].gols_a_team, d[i].reason, d[i].city, d[i].country, d[i].neutral_field );
fprintf(output, "%li,%s,%s,%d,%d,%s,%s,%s,%s\n", d[i].date, d[i].h_team, d[i].a_team, d[i].gols_h_team, d[i].gols_a_team, d[i].reason, d[i].city, d[i].country, d[i].neutral_field );

}

}

int main(int argc, char *argv[])
{
FILE *input;
FILE *output;
char *string = "output.txt";
int size = 2;

open_input(argv, &input);
open_output(string, &output);

Data *d;
d = (Data*)malloc(size*sizeof(Data));
alloc_Data(d, size);

store(d, input, output, size);

free(d);

return 0;
}

最佳答案

OP 的 fscanf() 格式困惑,%[^,] 后面有一个 s 并且缺少 ,@Gem Taylor

更好的选择是使用 fgets() 读取所有行。 (包括第一个)

// fscanf(input, "%li,%[^,]s%[^,]s%d,%d,%[^,]s%[^,]s%[^,]s%[^,]s",...d[i].neutral_field );

#define EXPECTED_MAX_BUFFER_SIZE 150
char buffer[EXPECTED_MAX_BUFFER_SIZE * 2]; // suggest using 2x expected max size
if (fgets(buffer, sizeof buffer, input)) {

然后使用 sscanf() 解析团队结果。在末尾使用 "%n" 是测试整个 sscanf() 是否成功且没有额外垃圾的简单方法。 sscanf() 应该受到宽度限制,复杂的扫描可以通过一些定义来管理说明符。注意 "%29[^,]"

之后没有 s
    int n = 0;
#define FDat "%li ,"
#define FScr "%d ,"
#define Ftxt " %29[^,],"
#define Fneu " %8[^,]"
sscanf(buffer, FDat Ftxt Ftxt FScr FScr Ftxt Ftxt Ftxt Fneu " %n",
&d[i].date, d[i].h_team, d[i].a_team,
&d[i].gols_h_team, &d[i].gols_a_team,
d[i].reason, d[i].city, d[i].country, d[i].neutral_field, &n);

if (n > 0 && buffer[n] == '\0') {
// success
fprintf(output, ...
} else {
// bad input
}

关于c - 分割长字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50745686/

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