下面是库函数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)
答案 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指针,则说明发生了某些事情。