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()返回 achar*以指示成功或失败,代码会忽略它,因此会发出警告。

但是,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

gets(p)有一个您没有存储的 char* 返回值。这不是一个真正的问题,但夹板只是提醒你这一点。

于 2012-09-27T11:06:54.140 回答