【发布时间】:2020-06-20 20:38:51
【问题描述】:
所以我正在慢慢地继续学习 C。现在,我有一个任务,从文件中读取数据并对其进行排序。
文件数据:
House naming 1 30 300
House naming 2 45 450
.......
House naming 10 5 120
所以,第一个值:House naming,可以是任何命名,如Empire state building
第二个值是:房屋地址(我只选择了integer值)
第三个值是:建筑物的年龄
第四个值是:千瓦时/年
程序必须从文件中获取数据 -> 打印出来 -> 排序(如何?见下文) -> 再次打印出来,排序。
排序:
- kwh
- kwh
- kwh > 300 && age > 40 - 准备拆除。
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include "input.h"
int main(void) {
int kwh;
int age;
char building[SIZE];
int addr;
char buff[SIZE];
FILE *fi;
// opening the files and checking if it succeeded
fi = fopen(F_INPUT, "r");
if (fi == NULL) {
printf("Error opening input file \"%s\"", F_INPUT);
exit(EXIT_INPUT_FAIL);
}
while (fgets(buff, sizeof(buff), fi) != NULL) {
sscanf(buff, "%s %d %d %d", building, &addr,&age,&kwh);
if (kwh < 200) {
puts(buff);
printf("Sustainable\n");
} else
if (kwh < 300 && age < 40) {
puts(buff);
printf("Needs renovation\n");
} else
if (kwh > 300 && age > 40) {
puts(buff);
printf("IN DEMOLITION LIST\n");
}
}
/* close the files when they're not needed anymore */
fclose(fi);
return 0;
}
我结合了几个步骤让它变得更容易,读取数据 -> 输出已标记为 1) 可持续,2) 需要翻新,3) 准备拆除。
问题出在while 循环中,我认为它出在sscanf 函数中。
在我的逻辑中,如果我没记错的话,它必须从文件中读取一个字符串,使用逻辑(查看sscanf 和输入文件):char value、integer、integer、integer。
程序读取文件,输出数据,但将所有建筑物标记为sustainable。
您建议更仔细阅读或阅读多个字符串时选择哪种逻辑更好。
输出:
House naming 1 30 300
Sustainable
House naming 2 45 450
Sustainable
........
House naming 10 5 120
Sustainable
【问题讨论】:
-
请注意,格式说明符
%s在第一个空格处停止,因此它不能用于读取,例如,“帝国国家建设”。一种解决方案可能是将输入字符串分解为带有strtok的令牌指针数组,从最后三个中提取整数,并从剩余的第一个中构建一个新字符串。 -
您的
sscanf未按预期工作。始终检查函数的返回值,在本例中为sscanf。并花时间学习如何使用调试器。也很有用:How to debug small programs -
sscanf with %s 读取直到遇到第一个空格。如果名称字段可以包含多个单词(包括数字?),它可能会令人生畏。尝试拆分为多个以空格分隔的字段;那么最后 3 个字段是数字,前 n-3 个字段是名称。
-
“房屋命名”可以包含数字吗?喜欢“Stdio 54”吗?
-
请注意,在您链接的页面上的示例中,输入中有 4 个格式说明符和 4 个由空格分隔的文本序列。如果有 五个 文本序列,例如
"Saturday Sunday March 25 1989",它将无法正常工作。格式%s在第一个空格处停止。 IMO 你能做的最好的事情是编写一个简短的测试程序来探索scanf的行为方式,并且没有其他目的。