C 使用write()打印到控制台
因此,我试图创建一个使用write系统调用printf的函数,并且其他选项不可用于将字符串输出到控制台。然而,我遇到了一个障碍 以下是我的功能:C 使用write()打印到控制台,c,C,因此,我试图创建一个使用write系统调用printf的函数,并且其他选项不可用于将字符串输出到控制台。然而,我遇到了一个障碍 以下是我的功能: static void doPrint (const char *s) { write (STDOUT_FILENO, s, sizeof(s)); } 被称为: doPrint你好,世界\n 但是,它只打印出: 你好,沃 我做错了什么 注:对stdlib和stdio的访问受到限制 在此上下文中,sizeof并不是您想要的,它生成的是指针的大
static void doPrint (const char *s)
{
write (STDOUT_FILENO, s, sizeof(s));
}
被称为:
doPrint你好,世界\n
但是,它只打印出:
你好,沃
我做错了什么
注:对stdlib和stdio的访问受到限制
在此上下文中,sizeof并不是您想要的,它生成的是指针的大小,而不是字符串的大小。改用strlen
但对stdlib的访问受到限制
你可以使用一段时间和一个计数器来滚动你自己的。未经测试:
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
但对stdlib的访问受到限制
你可以使用一段时间和一个计数器来滚动你自己的。未经测试:
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以处理空终止字符。问题在于您的大小。您需要显式传入大小或使用strlen。它采用指针的大小。strlen只适用于以null结尾的字符串。问题在于您的大小。您需要显式传入大小或使用strlen。它采用指针的大小。strlen只适用于以null结尾的字符串。问题在于指针变量的大小是指针变量的长度。您希望strlens发现指针上有多少个字符。问题在于指针变量的大小是指针变量的长度。您想让strlens发现指针上有多少个字符。您不想看到sizeofs。要打印的字符数是字符串的长度,而不是指向字符串中第一个字符的指针的大小。您不需要sizeofs。要打印的字符数是字符串的长度,而不是指向字符串中第一个字符的指针的大小。s是指针,而不是数组,因此您只打印第一个sizeofchar*字节。在这种情况下,它恰好是8个字节—您可能使用的是64位系统
必须使用strlen查找字符串的长度:
您还应该阅读。s是一个指针,而不是数组,因此您只打印第一个sizeofchar*字节。在本例中,它正好是8个字节—您可能使用的是64位系统
必须使用strlen查找字符串的长度:
您还应该阅读。编写标准文件号、s、strlens;假设字符串以null结尾 写入标准文件号、s、strlens;假设字符串以null结尾 是的,我本来打算用它,但是对stdlib的访问是受限的。挑剔:使用指针算法,我的strlen会稍微更有效一些,代码是:const char*end=s;而*end++{};返回端-s-1@海德:我真的想用它,但尽管不太容易理解,我还是很懒,真的。请随意编辑我的帖子。@cnicutar不,你是对的,越清晰的版本可能作为答案越好,而稍微高效一点的版本作为评论就越好。是的,我打算用它,但是对stdlib的访问是受限的;而*end++{};返回端-s-1@海德:我真的想用它,但尽管不太容易理解,我还是很懒,真的。请随意编辑我的帖子。@cnicutar不,你是对的,更清晰的版本可能会更好地作为答案,而更高效的版本作为注释更好。你很幸运有64位编译器。。。有了32位编译器,以这种方式使用sizeof简直就是地狱;您很幸运拥有64位编译器。。。有了32位编译器,以这种方式使用sizeof简直就是地狱;