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 **’
多くの人が、strlen()が最適化された関数でコンパイルされた関数であることが多いにもかかわらず、strlen()よりも文字列定数の方がsizeof()-1を好むでしょう。 – johannes
良い点は、0ターミネータのスペースも必要なので、 'sizeof'は' + 1'も取り除きます。 –
"-1を取り除く"について:sizeof() - 1 + strlen()+ 1は、意図をはっきりさせます。 sizeof()+ strlen()のみを使用すると、strlenとsizeofの両方が使用され、\ 0のための十分なスペースが割り当てられていることがわかります。 – johannes