【发布时间】:2020-07-20 00:16:51
【问题描述】:
我是 C 的初学者,我正在尝试创建一个简单的待办事项列表程序。我正在尝试在 while 循环中使用 getline ,正如我在另一个堆栈溢出答案中看到的那样,我以为我理解了它,但它只是创建了一个无限循环。此外,由于某种原因,它似乎跳过了第一个单词。到目前为止,这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
FILE *list;
int i = 0;
int item = 0;
char items[10];
char chars[1000];
char * line = NULL;
size_t len = 0;
ssize_t read;
int main() {
list = fopen("/Users/bendavies/Documents/C/list.txt", "r");
int letterCount = fscanf(list,"%s",chars);
printf("Welcome to the to-do list. It can hold up to 10 items.\n");
printf("%d\n", letterCount);
if (letterCount == -1) {
printf("The list currently has no items!\n");
} else {
while ((read = getline(&line, &len, list)) != 1) {
item += 1;
printf("%d. %s", item, line);
}
}
fclose(list);
return 0;
}
我目前通过以下 list.txt 获得的输出:
Eat food
Drink water
Breath air
是:
1. food
2. Drink water
3. Breath air
4. 18446744073709551615
5. 18446744073709551615
等等等等。
提前感谢您! :)
【问题讨论】:
-
考虑将
(read = getline(&line, &len, list)) != 1更改为(read = getline(&line, &len, list)) != -1,我认为fscanf正在读取第一个单词,而您先生并没有提供完整的输出。 -
风格指南:创建全局变量作为最后的手段。它们有时是必需的,但代码中的任何一个都不应该是全局的。当它们在函数之外时,将它们设为
static,除非有另一个源文件也需要访问它们(也可以使用函数)。当一个变量或函数必须在多个文件中访问时,创建一个头文件来声明它们,并将头文件包含在定义变量和函数的文件以及使用它们的文件中。然后您会注意到items和chars是未使用的变量。你也必须初始化item。 -
如果您确保没有泄漏,请记住在循环后
free(line);。即使第一次调用最终检测到 EOF,getline()分配内存也是很正常的。