【问题标题】:Passing string literals in K&R C在 K&R C 中传递字符串文字
【发布时间】: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 Askminimal reproducible example
  • 也许我在这里是湿毯子,但是如何使用 #asm#endasm 连接到“K & R C”?我以为他们有asm { ... }
  • 换句话说,从来没有一个 K&R 标准。过去有 K&R C 编译器,但您没有使用其中之一。

标签: c arrays string pointers kernighan-and-ritchie


【解决方案1】:

第一:

printf("%s", "literal string");

对我来说效果很好。一定适合你。

第二个:好久不见你的asm代码不正确,必须调用:

int 80h

为了将命令传递给内核。您必须知道如何进行 Linux 系统调用。

请签入https://www.tutorialspoint.com/assembly_programming/assembly_system_calls.htm

了解更多详情。

HTH。 我觉得

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-19
    • 2018-04-07
    • 2012-11-04
    • 2017-04-06
    • 1970-01-01
    • 2021-02-07
    • 1970-01-01
    • 2014-04-30
    相关资源
    最近更新 更多