【发布时间】:2016-01-17 05:37:21
【问题描述】:
现在我被困在如何从文本文件中获取字符串并根据这些单词创建两个单独的数组。文件中的字符串示例如下:
BQN 阿瓜迪亚,波多黎各
格式:
<3 letter code><2 white spaces><a string up to 100 characters>
有一个 100 strings 列表,我正在尝试创建一个数组来仅存储 3 个字母代码,另一个 array 来存储机场。
代码:
#include <stdio.h>
#include <string.h>
#define MAX_LINE_LENGTH 1000
int main()
{
FILE *airports;
airports = fopen("airports.txt", "r");
FILE *routes;
routes = fopen("routes.txt", "r");
FILE *flights;
flights = fopen("flights.txt", "r");
char line[MAX_LINE_LENGTH];
char air[100][3];
char airp[100][100];
if (airports == NULL)
{
printf("Could not open database files\n");
}
else
{
int i = 0;
while(fgets(line, MAX_LINE_LENGTH, airports) != NULL)
{
sscanf(line, "%s" , air[i]);
strcpy(airp[i], line+5);
i++;
}
printf("%s" "%s", air, airp);
这个项目还有很多,所以代码不完整。
我已经包含了 printf 只是为了查看数组是否有效。到目前为止,它只在一行中打印了所有 3 个字母代码,后跟第一个机场。
我的描述有点混乱,但我们将不胜感激!
【问题讨论】:
-
printf("%s" "%s", air, airp);只打印每个数组中的第一个元素。我猜你想把它放在while循环中并更改为printf("%s %s\n", air[i], airp[i]); -
并且您应该警惕
sscanf和strcpy调用中的缓冲区溢出。 -
不要缩进文件打开测试下的所有内容,只需测试
if (airports == NULL) { printf (...); return 1; }并在那里完成if块。你所做的很好,你可以很容易地结束比必要更多的缩进。换句话说,你可以不用else。 -
@kaylum sscanf 和 strcpy 不应该将所有字符串放入字符串数组中,因此 printf 不应该打印出整个数组吗?如果是这样,我不需要将 printf 放入 while 循环中吗?另外,缓冲区溢出是什么意思?
-
@Peter 建议你复习一下 C 指针和数组。是的,你确实有一个字符串数组。但是您不能使用单个格式说明符打印任何内容的数组。
air本身只给出数组中的第一个元素。 RE 缓冲区溢出 - 每个air[i]只有 3 个字节长。存储 3 个字符的字符串需要 4 个字节,因为每个字符串的末尾都有一个 NUL 终止符。此外,如果在字母代码长度超出预期的情况下输入错误,会发生什么?良好的编程要求您防止任何不良输入。