与库函数gets()混淆

时间:2020-07-21 00:49:25

标签: c

下面是库函数gets()

的实现
// I know gets() can cause buffer overflow easily, just use this fuction for demo purpose

char *gets(char *s)
{
   int c;
   char *dest = s;

   while ((c = getchar()) != ’\n’ && c != EOF)
      *dest++ = c;
   if (c == EOF && dest == s)
      return NULL;
   *dest++ = ’\0’;
   return s;
}

void echo()
{
   char buf[8];
   gets(buf);
}

我有两个问题:

对于此语句*dest++ = c;的Q1,我们知道后缀增量的优先级高于取消引用的优先级,因此*dest++等效于*(dest++),但不是我们失去了第一个元素buf [0]?

Q2-为什么gets()需要返回一个char指针?返回指针与参数s不同吗?将gets()方法签名设为:

void gets(char *s)

2 个答案:

答案 0 :(得分:3)

对于此语句*dest++ = c;的Q1,我们知道后缀增量的优先级高于取消引用的优先级,因此*dest++等效于*(dest++),但不是我们失去了第一个元素buf[0]

否,因为后增量返回变量的旧值,而不是增量值。因此,我们取消引用原始的dest值,然后对其进行递增。等同于

*dest = c;
dest++;

如果它是*(++dest) = c;

Q2-为什么gets()需要返回一个char指针?返回指针与参数s是否不相同?使gets()方法签名为:

返回值可用于判断是否有错误。如果发生错误,它将返回NULL

它本可以设计为返回整数状态。但是设计人员认为,如果返回值比这有意义的话,它将更有用。

许多C字符串函数同样具有冗余性。例如,strcat()strcpy()都返回目标字符串指针。

答案 1 :(得分:1)

对于此语句* dest ++ = c ;,我们知道后缀递增的优先级高于取消引用的优先级,因此* dest ++等同于*(dest ++),但不是我们丢失了第一个元素buf [0 ]?

操作{orderNumber: 2393, clientId: 'FD23949fsad293fa2'}将返回dest++的值之前

Q2-为什么gets()需要返回一个char指针?返回指针与参数s是否不相同?使gets()方法签名为:

您可以,但是随后您将丢失返回值提供的信息。如果返回NULL指针,则说明发生了某些事情。

相关问题