使用write()函数向控制台打印信息

3

我正在尝试创建一个函数,使用write()系统调用(printf和其他选项不可用)将字符串输出到控制台。 然而,我遇到了一个问题。

这是我的函数:

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

被以下代码调用:

doPrint ("Hello World!\n");

然而,它只打印出:

Hello Wo

我做错了什么?

注意:无法访问stdlib和stdio库。

谢谢!


7
你很幸运拥有64位编译器……如果是32位的编译器,使用sizeof会变成一场噩梦 ;) - hyde
6个回答

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

是的,我本来想用那个,但是标准库的访问受限制。 - Pat
1
吹毛求疵:使用指针算术运算,my_strlen 函数可以稍微优化一下代码:const char *end=s; while (*end++) {}; return end-s-1; - hyde
@hyde 我其实想过使用那个,但觉得可能不太容易理解(其实是我太懒了)。你可以随意编辑我的帖子。 - cnicutar
@cnicutar,不,你是对的,更清晰的版本可能作为答案更好,而那个略微更高效的版本则更适合作为评论。 - hyde

0

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

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

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

你还应该阅读这份文档


0
问题出在你的sizeof上。你需要显式地传递尺寸或使用strlen。它正在获取指针的大小。strlen只适用于以null结尾的字符串。

0
问题在于指针变量的sizeof是指针变量的长度。你需要使用strlen(s)来发现指针中有多少个字符。

0

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


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接