2013-02-13 175 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));假設您的字符串是空終止的。