gpt4 book ai didi

c - printf 由 Apple 实现

转载 作者:行者123 更新时间:2023-12-01 23:07:14 34 4
gpt4 key购买 nike

https://opensource.apple.com/source/xnu/xnu-201/osfmk/kern/printf.c.auto.html

你好!在分析Apple的printf代码时,我有一个问题!

case 's':
{
register char *p;
register char *p2;

if (prec == -1)
prec = 0x7fffffff; /* MAXINT */

p = va_arg(*argp, char *);

if (p == (char *)0)
p = "";

if (length > 0 && !ladjust) {
n = 0;
p2 = p;

for (; *p != '\0' && n < prec; p++)
n++;

p = p2;

while (n < length) {
(*putc)(' ');
n++;
}
}

n = 0;

while (*p != '\0') {
if (++n > prec || (length > 0 && n > length))
break;

(*putc)(*p++);
}

if (n < length && ladjust) {
while (n < length) {
(*putc)(' ');
n++;
}
}

break;
}

如下所示,Apple 剪切掉“%2s”一词并打印出来。

例如,“hello”被打印为“he”!

但是,实际的 printf 输出如果不超过字符串的长度,将会返回整个字符串。

例如,“hello”打印为“hello”!

我缺少 Apple 代码的哪一部分?


这是%3s的代码。
在我的代码中:

void printf_str(va_list listp, t_list *_flags)
{
char *src;
char *src_cpy;
long n;

if (_flags->prec == -1)
_flags->prec = 0x7fffffff;
src = va_arg(listp, char *);
if(src == (char *)0)
src = "";
if (_flags->length > 0 && !_flags->ladjust)
{
n = 0;
src_cpy = src;
while (*src != '\0' && n < _flags->prec)
{
n++;
src++;
}
printf("%ld, %d, %d\n", n, _flags->prec, _flags->length);
src = src_cpy;
while (n < _flags->length)
{
putchar_fd(1, ' ');
n++;
}
}
n = 0;
printf("%ld, %d, %d\n", n, _flags->prec, _flags->length);
while (*src != '\0')
{
printf("%ld, %d, %d\n", n, _flags->prec, _flags->length);
if (++n > _flags->prec || (_flags->length > 0 && n > _flags->length))
break;
putchar_fd(1, *(src++));
}
printf("%ld, %d, %d\n", n, _flags->prec, _flags->length);

if (n < _flags->length && _flags->ladjust)
{
while (n < _flags->length)
{
putchar_fd(1, ' ');
n++;
}
}
}

长度:3 精度:-1 l调整:0 *fmt:s

结果:
5、2147483647、3
0, 2147483647, 3
0, 2147483647, 3
h1, 2147483647, 3
e2, 2147483647, 3
l3, 2147483647, 3
4, 2147483647, 3

实际输出部分将是这部分。

while (*p != '\0') {
if (++n > prec || (length > 0 && n > length))
break;

(*putc)(*p++);
}

再次总结我的问题,这是Apple的代码,但是printf在mac上的行为完全打印出hello。那么当我重新实现时,我应该遵循哪些准则?

最佳答案

这不是您想象的 printf — 它是内部内核 printf,而不是由 C 程序调用的 libc printf。据我所知,您对代码的解释是正确的,如果给定的长度小于字符串的长度,它会截断字符串。您在程序中看不到这种行为,因为您没有使用此 printf。

关于c - printf 由 Apple 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61831828/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com