Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用write()打印到控制台_C - Fatal编程技术网

C 使用write()打印到控制台

C 使用write()打印到控制台,c,C,因此,我试图创建一个使用write系统调用printf的函数,并且其他选项不可用于将字符串输出到控制台。然而,我遇到了一个障碍 以下是我的功能: static void doPrint (const char *s) { write (STDOUT_FILENO, s, sizeof(s)); } 被称为: doPrint你好,世界\n 但是,它只打印出: 你好,沃 我做错了什么 注:对stdlib和stdio的访问受到限制 在此上下文中,sizeof并不是您想要的,它生成的是指针的大

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

以下是我的功能:

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简直就是地狱;