0

EXC_BAD_ACCESS(code = 1)で失敗し、次の警告が表示される次のコードがあります。

'int'をタイプ'constchar*'のパラメーターに渡す互換性のない整数からポインターへの変換

char *printb(fmt,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)
{
    static char string[256];
    sprintf(string,fmt,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10);
    return(string);
}

printbはこのコードによって呼び出されています:

    if (gotargs) fname = *(argv++);
    else do {
        printf("file name #%d: ", i+1);
        fname = gets(inbuf);
    } while (*fname == 0);
    if ((gbuf=fopen(fname, "r")) == NULL)
        error(printb("I can't find '%s'", fname));
    printf("reading '%s'...\n", fname);
    if (fgets((lp = inbuf), 512, gbuf) == NULL)
        error("file is empty");

また、gets()をfgets()に正しく変換するにはどうすればよいですか?

ありがとう

4

1 に答える 1

3

さて、なぜ古代式の関数宣言を使用したのですか?

char *printb(fmt,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)
{

この宣言は、すべての引数をintsとして宣言します。この関数へのポインタを渡そうとするとchar *、災害につながるだけです。さらに、呼び出しですべてのパラメーターを指定しているわけではありませんprintb。これは別の災害です。

引数の数が可変の関数を実装しようとしているようです。特にそのために、言語は...パラメータ宣言をサポートしています。可変個引数関数とについて読んでくださいva_list

あなたの関数は次のように実装されます

char *printb(const char *fmt, ...)
{
   static char string[256];
   va_list va;

   va_start(va, fmt);
   vsprintf(string, fmt, va);
   va_end(va);

   return string;
}

以上

   ...
   vsnprintf(string, sizeof string, fmt, va);
   ...

内部静的バッファへのポインタを返すという考えにも欠陥がありますが。

一方、メソッドで可変個引数を「エミュレート」しようとするのは絶望的です。動作しません。

于 2012-12-08T01:12:51.190 に答える