2015-02-08 58 views
-3

我在写一个状态函数,但是除了“被跟踪:”之外没有任何东西正在打印出来。任何人都能看到为什么我假设“.index”文件只是一行一行的文件名列表。printf在C中的错误

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); 
} 
+2

Craaaaa注册警告。它会立刻弹出。 – Quentin 2015-02-08 02:02:58

+0

咦? .......... – Jobs 2015-02-08 02:03:54

+0

问问你自己,fgets有多少个字符读取以及它们进入了什么内存? – 2015-02-08 02:08:04

回答

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()函数将字符串分解为一个零序列或 更多 非空令牌。在第一次调用strtok()时,应该在str中指定要解析的字符串 。在每一个应该解析 相同字符串的后续调用中,str必须为NULL。

+1

'p'不是一个整数。建议更改为“未初始化的地址” – 2015-02-08 02:25:26

+0

请注意,问题中的代码使用'strtok()'在字符串的末尾敲入换行符,假设它存在。这是一个奇怪的,但有效的使用'strtok()' - 因为任何使用'strtok()'都是有效的。这绝对不是传统的方法来进行换台,但它确实有效。 – 2015-02-08 02:31:16