2013-02-13 109 views
2

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

这里是我的功能:

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

正在由名为:

doPrint;(的 “Hello World \ n!”)

但是,它只打印出:

您好禾

我在做什么错?

注:访问STDLIB和标准输入输出被限制

感谢

+4

你很幸运有64位编译器......有了32位编译器,它就是'Hell'使用'sizeof'那样;) – hyde 2013-02-13 21:41:26

回答

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

+0

是的,我打算使用它,但是访问stdlib受限制。 – Pat 2013-02-13 21:30:38

+0

工作,谢谢一堆! – Pat 2013-02-13 21:35:35

+1

Nitpicking:使用指针运算'my_strlen'会比这个代码更有效率:'const char * end = s; while(* end ++){}; return end-s-1;' – hyde 2013-02-13 21:44:44

0

问题是您的sizeof。您需要明确传递尺寸或使用strlen。它正在取指针的大小。尽管如此,strlen仅适用于以空字符结尾的字符串。

0

问题是sizeof指针变量是指针变量的长度。您需要strlen(s)来发现指针处有多少个字符。

0

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

0

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

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

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

你也应该阅读this document

0

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