2

所以我试图创建一个使用 write() 系统调用(printf 和其他选项不可用)将字符串输出到控制台的函数。然而,我遇到了一个障碍。

这是我的功能:

static void doPrint (const char *s)
{
    write (STDOUT_FILENO, s, sizeof(s));
}

由以下人员调用:

doPrint ("Hello World!\n");

但是,它只打印出来:

你好沃

我究竟做错了什么?

注意:对 stdlib 和 stdio 的访问受到限制

谢谢

4

6 回答 6

4

在这种情况下sizeof不会做你想要的 - 它产生指针的大小,而不是字符串的大小。改为使用strlen

但对标准库的访问受到限制

while您可以使用 a和计数器滚动自己。未经测试:

size_t my_strlen(const char *s)
{
    size_t len = 0;
    while (*s++)
        len++;

    return len;
}

或更高效的版本:

size_t my_strlen(const char* s)
{
   const char *end = s;
   while (*end++) {};
   return end-s-1;
}

上面的工作是因为指针前进到字符串中的最后一个位置,然后大小是最后一个指针位置和第一个指针位置之间的差异,减 1 当然可以处理空终止字符。

于 2013-02-13T21:28:39.017 回答
0

s是一个指针,而不是一个数组,所以你只打印第一个sizeof(char *)字节(在这种情况下它恰好是 8 - 你可能使用的是 64 位系统)。

您必须使用以下方法找到字符串的长度strlen()

write (STDOUT_FILENO, s, strlen(s));

您还应该阅读这份文件

于 2013-02-13T21:29:06.257 回答
0

write (STDOUT_FILENO, s, strlen(s));假设您的字符串以空值结尾。

于 2013-02-13T21:29:13.427 回答
0

问题是你的sizeof. 您需要显式传递大小或使用strlen. 它正在占用指针的大小。strlen仅适用于以空字符结尾的字符串。

于 2013-02-13T21:28:39.470 回答
0

问题是sizeof指针变量是指针变量的长度。您想strlen(s)知道指针上有多少个字符。

于 2013-02-13T21:28:42.460 回答
0

你不想sizeof(s)。您要打印的字符数是字符串的长度,而不是指向字符串中第一个字符的指针的大小。

于 2013-02-13T21:28:49.890 回答