gpt4 book ai didi

创建 scanf 以格式化文本文件

转载 作者:太空宇宙 更新时间:2023-11-04 08:31:53 25 4
gpt4 key购买 nike

我必须像这样格式化一行:

<Ana Baldwin>        gpa    3.71      <Modesto Adventist Academy>       SAT math  553     SAT reading  766

看起来像这样:

Ana Baldwin   3.71   Modesto Adventist Academy      553    766

到目前为止我的代码是:

int main(void)
{
int matchcount;
char name[20], GPA[6], school[30], SATmath[10], SATreading[10];

char dontcareGPA, dontcareSATmath, dontcareSATreading;
char dontcare1, dontcare3;
char dontcare2[40], dontcare4[40];

matchcount = scanf ("%[^<]%c%[^>]%c%c%[^<]%c%[^>]%c%[^0-9]%[0-9]%c%[^0-9]%[0-9] ",
&dontcare1,
&name[0], &dontcare2[0], &dontcareGPA,
&GPA[0], &dontcare3,
&school[0], &dontcare4[0], &dontcareSATmath,
&SATmath[0], &dontcareSATreading,
&SATreading[0]);
while ((matchcount != 0) && (matchcount != EOF))
{
printf ("%-20.20s %-6.6s %-30.30s %-10.10s %-10.10s\n", name, GPA, school, SATmath, SATreading);

matchcount = scanf ("%[^<]%c%[^>]%c%c%[^<]%c%[^>]%c%[^0-9]%[0-9]%c%[^0-9]%[0-9] ",
&dontcare1,
&name[0], &dontcare2[0], &dontcaregpa,
&GPA[0], &dontcare3,
&school[0], &dontcare4[0], &dontcareSATmath,
&SATmath[0], &dontcareSATreading,
&SATreading[0]);
}

return 0;
}

我最难理解不同的 scanf 格式。

最佳答案

您有一些好点子,也有一些不太好。您可以通过使用 * 抑制相应的分配来避免“不关心”输入在格式字符串中。或者,您可以制作格式字符串,这样它们就完全没有必要了。

您目前拥有:

matchcount = scanf ("%[^<]%c%[^>]%c%c%[^<]%c%[^>]%c%[^0-9]%[0-9]%c%[^0-9]%[0-9] ",
&dontcare1,
&name[0], &dontcare2[0], &dontcareGPA,
&GPA[0], &dontcare3,
&school[0], &dontcare4[0], &dontcareSATmath,
&SATmath[0], &dontcareSATreading,
&SATreading[0]);

第一个格式项查找一个或多个非 <字符,但如果输入的第一个字符是 < ,匹配立即失败。如果<前有空格或其他字符,那么某些转换将起作用。然而,决定哪些数据包含哪些内容变得非常复杂。我认为第三个%c会读到一片空白;以下%[^>]会读到空白,gpa , <和学校名称到 > ,这与您的想法不太一样。

你真的需要这样的东西:

matchcount = scanf(" <%19[^>]> gpa %5s <%29[^>]> SAT math %9[0-9] reading %9[0-9]",
&name[0], &GPA[0], &school[0], &SATmath[0], &SATreading[0]);

我已将字符串限制为比声明的变量大小小一。

当前你的循环条件是:

while  ((matchcount != 0) && (matchcount != EOF))

它需要是:

while (matchcount == 5)

几乎总是,您想要测试您是否获得了预期的转化项目数。你真的想避免 scanf() 的大重复声明也。我想你还没有学过结构,所以我想我会写一个函数:

int get_info(char *name, char *GPA, char *school, char *SATmath, char *SATreading)
{
return scanf(" <%19[^>]> gpa %5s <%29[^>]> SAT math %9[0-9] reading %9[0-9]",
name, GPA, school, SATmath, SATreading);
}

封装scanf()语句,然后在循环条件中使用它:

while (get_info(name, GPA, school, SATmath, SATreading) == 5)
printf(…);

关于创建 scanf 以格式化文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27957623/

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