使用write()打印到控制台
问题描述:
所以我试图创建一个函数,它使用write()系统调用(printf和其他选项不可用)将字符串输出到控制台。但是,我遇到了一个障碍。使用write()打印到控制台
这里是我的功能:
static void doPrint (const char *s)
{
write (STDOUT_FILENO, s, sizeof(s));
}
正在由名为:
doPrint;(的 “Hello World \ n!”)
但是,它只打印出:
您好禾
我在做什么错?
注:访问STDLIB和标准输入输出被限制
感谢
答
在这种情况下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来处理空终止字符。
答
问题是您的sizeof
。您需要明确传递尺寸或使用strlen
。它正在取指针的大小。尽管如此,strlen
仅适用于以空字符结尾的字符串。
答
问题是sizeof
指针变量是指针变量的长度。您需要strlen(s)
来发现指针处有多少个字符。
答
你不想要sizeof(s)
。要打印的字符数是字符串的长度,而不是指向字符串中第一个字符的指针的大小。
答
s
是一个指针,而不是一个数组,因此您只打印第一个sizeof(char *)
字节(在这种情况下恰好是8--您可能使用的是64位系统)。
你必须找到使用strlen()
字符串的长度:
write (STDOUT_FILENO, s, strlen(s));
你也应该阅读this document。
答
write (STDOUT_FILENO, s, strlen(s));
假设您的字符串是空终止的。
你很幸运有64位编译器......有了32位编译器,它就是'Hell'使用'sizeof'那样;) – hyde 2013-02-13 21:41:26