2012-05-08 8 views
0

私は、ファイルへのフルパスを提供するために環境変数とプリセット文字列を組み合わせて開くファイルを取得するログ解析プログラムで作業していますが、sprintfから出力を取り出すのに問題があります。環境変数とプリセット文字列を組み合わせるために使用しているので、誰かがこれを正しく動作させるために必要なことについてアドバイスを提供できるかどうか疑問に思っていましたか?ありがとう! gccのどのようにfopenのファイル名としてsprintfの出力を使用できますか?

を使用してコンパイル中に(私はちょうど彼らが私にはどうあるべきか明らかに関係なく、最後の数週間にわたって自分自身にCを教え始め、その任意のヒントにIMをオープンしている)

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#define _GNU_SOURCE 
void main(int argc, char *argv[], char *envp[]) 
{ 
    FILE *fd; // File pointer 
    char *name; 
    char *filename[]; 
    name = getenv("MCEXEC_PLAYERNAME"); 
    sprintf(filename,"/home/minecraft/freedonia/playerdata/deathlog-%s.txt",name); 
    char buff[1024]; 
    if ((fd = fopen(filename, "r")) != NULL) // open file 
    { 
    fseek(fd, 0, SEEK_SET); // make sure start from 0 

    while(!feof(fd)) 
    { 
     memset(buff, 0x00, 1024); // clean buffer 
     fscanf(fd, "%[^\n]\n", buff); // read file *prefer using fscanf 
    } 
    printf("Last Line :: %s\n", buff); 
    } 
    else 
    printf("fail"); 
} 

ここでは、私が取得エラーです

lastline.c: In function ‘main’: 
lastline.c:9: error: array size missing in ‘filename’ 
lastline.c:11: warning: passing argument 1 of ‘sprintf’ from incompatible pointer type 
/usr/include/stdio.h:341: note: expected ‘char * __restrict__’ but argument is of type ‘char **’ 
lastline.c:13: warning: passing argument 1 of ‘fopen’ from incompatible pointer type 
/usr/include/stdio.h:249: note: expected ‘const char * __restrict__’ but argument is of type ‘char **’ 

答えて

3
char *filename[]; 

は、未知のサイズのcharへのポインタの配列を宣言します。十分な既知の長さのcharsprintfの配列が必要です。あなたはnameが予想よりも長く判明した場合に不快な驚きを避けるために、

filename = malloc(sizeof "/home/minecraft/freedonia/playerdata/deathlog-.txt" - 1 + strlen(name) + 1); 
if (!filename) exit(EXIT_FAILURE); 

を名前を得た後にcharmalloc十分なメモリへのポインタとして

char filename[1000]; // assuming 1000 is large enough 

または

char *filename; 

を宣言。

+0

多くの人が、strlen()が最適化された関数でコンパイルされた関数であることが多いにもかかわらず、strlen()よりも文字列定数の方がsizeof()-1を好むでしょう。 – johannes

+0

良い点は、0ターミネータのスペースも必要なので、 'sizeof'は' + 1'も取り除きます。 –

+0

"-1を取り除く"について:sizeof() - 1 + strlen()+ 1は、意図をはっきりさせます。 sizeof()+ strlen()のみを使用すると、strlenとsizeofの両方が使用され、\ 0のための十分なスペースが割り当てられていることがわかります。 – johannes

関連する問題