0

簡単なコード(以下の一部)を作成し、スプリントを使用して警告をチェックしました。しかし、スプリントは不平を言っています。私が見逃している問題は何でしょうか?

スプリント警告

malloctest.c:24:3: Return value (type char *) ignored: gets(p)
  Result returned by function call is not used. If this is intended, can cast
  result to (void) to eliminate message. (Use -retvalother to inhibit warning)

コード部分

p= (char*)malloc(BUFFER*sizeof(char));

    if(p==NULL)
        {
            printf("the memory could not be allocated");
        }
    else
    {
        gets(p);  //line 24
        printf("the name entered is \n%s\n",p);
    }

前もって感謝します!

4

3 に答える 3

3

gets()成功または失敗を示すためにaを返しますchar*。これはコードが無視しているため、警告です。

ただし、gets()バッファオーバーランを防ぐ方法はありません。代わりに、フォーマット指定子で使用できscanf()ます"%Ns"(またはfgets()文字列にスペースを含めることができる場合)。

if (1 == scanf("%9s", p)) /* if BUFFER(_SIZE ?) was 10.
                             The 'N' in the format specifier
                             must be 1 less than size of
                             the buffer to allow for null
                             terminator. */
{
}
于 2012-09-27T11:09:35.330 に答える
1

常にgets()使用しないでください。

gets()はバッファの長さをチェックしないため、非常に危険な関数であり、これによりバッファオーバーフローが発生する可能性があります。

#include <stdio.h>
int main(void) {
  char buffer[10];
  gets(buffer);
  puts(buffer);
  return 0;
}

たとえば入力する場合0123456789 10 11 12 13大きな問題があります。

fgets()代わりに使用することをお勧めします。

#include <stdio.h>
int main(void) {
  char buffer[10];
  fgets(buffer, sizeof buffer, stdin);
  puts(buffer);
  return 0;
}
于 2012-09-27T11:46:04.873 に答える
0

get(p)には、保存していないchar*の戻り値があります。これは実際には問題ではありませんが、スプリントはそれを思い出させるだけです。

于 2012-09-27T11:06:54.140 に答える