【发布时间】:2020-02-13 01:01:38
【问题描述】:
假设您有一个 putchar 函数,它将单个字符作为参数并将该单个字符打印到屏幕上:putchar(char c)。
然后假设您想在此基础上构建一个函数来打印字符串:printf(char a[]) 或 printf(char *a)。
在 K&R C(C89 之前)中,将字符串文字传递给接受数组或指针参数的 printf 函数是否合法?
它对我没有用。当我运行程序时,该功能不打印任何内容。
具体来说:
bputchar(char c)
{
#asm
mov ax, #0x0000
mov ds, ax
mov ah, #0x0e
mov bx, sp
mov al, 2[bx]
xor bx, bx
int #0x10
#endasm
}
bprintf(char *a)
{
unsigned char i;
i = 0;
for (a; *a != '\0'; a++)
{
i = *a;
bputchar(i);
}
}
/* OR (ALTERNATE PRINTF) */
bprintf(char a[])
{
unsigned char i;
i = 0;
for (i; a[i] != '\0'; i++)
{
bputchar(a[i]);
}
}
prompt()
{
bprintf("prompt:\\");
}
Prompt() 包含要打印的字符串。
但是无论使用哪种 bprintf 变体,它都不会打印任何内容。我知道 bputchar 函数有效。将字符串传递给 K&R C 中的函数有什么问题吗?还是我的代码有其他问题?我猜是后者,因为 K&R C 第一版有他们的 printf 函数使用作为参数传递的字符串的示例。
感谢您的帮助。
【问题讨论】:
-
这是完全合法的,但我也没有发现任何会破坏这一点的特别错误。
-
在
bprintf(char *a)中,i的目的是什么?为什么不简单地while (*a) putchar(*a++);?要测试您的代码,请将bputchar替换为putchar-- 您仍然没有收到任何输出吗? -
又一个XY problem? K&R 与这些有什么关系?您真的在使用 pre-C 标准编译器吗?如果您只是使用 K&R 作为参考手册,它仍然与您的特定问题没有任何关系。您正在尝试打印某些内容但失败了。阅读How to Ask 和minimal reproducible example。
-
也许我在这里是湿毯子,但是如何使用
#asm和#endasm连接到“K & R C”?我以为他们有asm { ... }? -
换句话说,从来没有一个 K&R 标准。过去有 K&R C 编译器,但您没有使用其中之一。
标签: c arrays string pointers kernighan-and-ritchie