我正在写一个状态函数,但除了“Tracked:”之外什么都没有打印出来。谁能明白为什么?我假设'.index'文件只是一行一行的文件名。
int git_status() {
FILE *check = fopen(".git/.index", "r");
int count = 0;
char *pointer;
printf("Tracked:\n\n");
while(fgets(pointer, sizeof(pointer), check)){
strtok(pointer, "\n");
printf("%s\n", pointer);
count++;
}
printf("\n%d is the number of files", count);
fclose(check);
}
答案 0 :(得分:3)
在C中,您需要为字符串分配所需的内存。在您的情况下,您需要声明具有固定长度的字符数组或动态保留足够的内存以包含您将要阅读的字符。
例如,以下不是很安全,因为p不指向任何内存,它只是一个未初始化的地址:
char* p;
strcpy(p, "This is a string");
如果幸运的话,当你尝试执行上述操作时,编译器应该发出警告(你可能需要在gcc上启用警告,-Wall
)。
更好的方法可能是
char chArray[20];
strcpy(chArray, "This is a string");
或
char *p = malloc(20);
strcpy(p, "This is a string");
free(p);
对于char *fgets(char *s, int size, FILE *stream)
,你可能想做类似的事情:
#define BUFFER 128
char buf[BUFFER];
while (fgets(buf, BUFFER, fp) != NULL) { /* TODO */ }
要使您的程序运行,您可能还需要查看strtok
的工作原理:
strtok()函数将字符串分解为零或0的序列 更多 非空的令牌。在第一次调用strtok()时要解析的字符串 应该在str中指定。在每个应该解析的后续调用中 相同的字符串,str必须为NULL。