【问题标题】:How to display string using write? [closed]如何使用 write 显示字符串? [关闭]
【发布时间】:2020-12-29 23:07:41
【问题描述】:

对于一个练习,我必须用这个原型显示一个字符串/字符链:

void display(char *str);

我无权使用'printf',但我必须使用'write'。

有人可以解释一下它是如何工作的吗?

我无权使用除写以外的任何功能!!!

【问题讨论】:

  • ISO C 标准没有函数write,只有函数fwrite。如果您确实需要使用函数write,那么您可能指的是 ISO C 标准的特定于平台的扩展。在这种情况下,请通过在您的问题中设置适当的标签来指定您的平台(例如“linux”或“posix”)。
  • 边信息:printf()旁边还有puts()
  • 没有人有权使用 write 来显示任何东西
  • @ffouquet42 是的,明白了。但这只是作为附带信息,以防您不知道。

标签: c pointers display write


【解决方案1】:

像这样(我假设你的意思是 *nix write 函数):

#include <unistd.h>

// EDIT: now without using string.h
size_t my_strlen(char const *str)
{
  size_t ret = 0u;
  while (str[ret++] != '\0')
    ;
  return ret;
}

void display(char const *str)
{
  write(STDOUT_FILENO, str, my_strlen(str));
}

【讨论】:

  • 我忘记了,除了写之外我没有其他功能
  • 我不能使用strlen ect,我只是有权使用#include 的write函数
  • 那你得自己写一个strlen或者把字符串的大小传给display。我提供了一个例子。
  • 指令是:用这个原型写显示字符串的函数,除了write之外你无权使用任何函数
  • 你当然有权使用你自己的函数...或者你可以将它内联在display中。
【解决方案2】:

一个独立高效的display函数:

void display(char const *str) {
    int length = 0;                    // string length
    const char *pch = str;             // pch points to start of string
    while (*pch++)                     // loop thtough string until the end of string
      length++;

    write(STDOUT_FILENO, str, length); // write the string in one go
}

【讨论】:

    【解决方案3】:

    由于你不能使用任何其他功能,我会使用这个:

    #define MAX_LENGTH 256
    void display(char const *str) {
        int lastIndex;
        for(lastIndex=0; str[lastIndex]!='\0' && lastIndex<MAX_LENGTH; lastIndex++) {}
        write(STDOUT_FILENO,str,lastIndex);
    }
    

    【讨论】:

    • 是的,更好,但你可以放弃对MAX_LENGTH 的测试,这完全没用,也不属于 OP 规范,因此还没有 +1。
    • 视情况而定,imo。如果 ffouquet42 不需要它,我相信他会删除它。
    • 为什么人为限制长度为256?如果你的绳子更长,你只需在 256 位砍掉?? OP 没有写任何关于最大长度的内容。
    • OP 也没有指定在 const char* 的末尾有一个 '\0'。假设它没有。我不知道该函数将在哪个上下文中使用。我只是想给他最好的答案。如果他不感兴趣,我相信他会删除那部分。
    • 他的 display 函数原型没有长度,只有指向字符串的指针,因此规范隐含地暗示字符串是 NUL 终止的,否则它没有任何意义。我最终否决了答案。无论如何,在 C 中,一个 string 是 NUL 终止的,否则它不会是一个字符串。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-05
    • 2015-10-22
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2021-03-12
    • 1970-01-01
    相关资源
    最近更新 更多