使用write()打印到控制台

时间:2013-02-13 21:27:02

标签: c

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

这是我的功能:

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

被称为:

  

doPrint(“Hello World!\ n”);

但是,它只打印出来:

  

Hello Wo

我做错了什么?

注意:限制访问stdlib和stdio

由于

6 个答案:

答案 0 :(得分:4)

在此上下文中sizeof不能执行您想要的操作 - 它会产生指针的大小,而不是字符串的大小。请改用strlen

  

但限制访问stdlib

您可以使用while和计数器自行推广。未测试的:

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来处理空终止字符。

答案 1 :(得分:0)

问题在于你sizeof。您需要明确传递大小或使用strlen。它占用了指针的大小。 strlen仅适用于以null结尾的字符串。

答案 2 :(得分:0)

问题是sizeof指针变量是指针变量的长度。您希望strlen(s)发现指针上有多少个字符。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

您必须使用strlen()找到字符串的长度:

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

您还应该阅读this document

答案 5 :(得分:0)

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