我有一个这样的文本文件:
姓名:Vincent
年龄:21
姓名:赫尔曼
年龄:22
姓名:亨德里克
年龄:42
程序会询问名称,并且必须使用此人的年龄打印txt文件中的名称。我只能打印名称,但不能打印年龄。
这是我的计划:
#include<stdio.h>
#include<string.h>
int main(void)
{
FILE *bestand;
char pers[32];
char tekens[500];
bestand = fopen("Bestand.txt", "r");
printf("Van welke persoon wilt u de leeftijd weten?");
gets(pers);
while (fgets(tekens,500, bestand)!=NULL)
{
if (strstr(tekens, pers) != NULL)
{
printf(tekens);
}
}
}
答案 0 :(得分:0)
我建议您阅读有关结构,数组以及如何将字符串拆分为标记的信息(strtok
可能对此有所帮助。)
然后为了解决您的问题,我建议您首先将文件的数据读入结构数组。之后要求用户输入名称,并在数组中搜索正确的结构,然后从结构中打印名称和年龄。
此外,您需要找出一些与案例无关的字符串比较的方法,例如,如果文件中的名称为Hendrik
,但用户输入hendrik
。
答案 1 :(得分:0)
每条记录为2行,因此每个循环读取2行。
有很多方法可以解析每一行。 sscanf()
在此处使用。
char pers[32+1];
char teken1[500];
char teken2[500];
fgets(pers, sizeof pers, stdin);
pers[strcspn(pers, "\n")] = '\0'; // Get rid of potential trailing \n
...
while (fgets(teken1, sizeof teken1, bestand) && fgets(teken2, sizeof teken2, bestand)) {
char name[32];
unsigned age;
if (1 != sscanf(teken1, "Name: %31s", name)) break; // invalid name
if (1 != sscanf(teken2, "Age: %u", &age)) break; // invalid age
if (strcmp(pers, name) == 0) {
printf("%s %u\n", name, age);
}
}
强烈建议不要printf(tekens);
。如果文件包含'%'
的行,则printf(tekens);
将尝试引用不存在的参数。最好使用fputs(tekens, stdout);
如@Raghu所述,请勿使用gets()
。它对用户输入没有限制,并且不是C11编译器的标准。
附加代码可以查找1)线路上的额外垃圾,2)合理的名称内容(所有字母或“ - ”)3)合理年龄4)名称空格5)不区分大小写