2020年4月14日 星期二

C 語言 - sprintf / snprintf

sprintf (char *s, const char *format, ...)

    C 語言並沒有其他語言方便的 container 去作字串轉換,所以 sprintf 就顯得強大許多。原理就是 printf 但輸入到字串。但會有 overflow 的 issue 產生。
    int main()
    {
        char str[5];
        sprintf(str, "ABC");
        printf("%s\n", str); // output : ABC
        return 0;
    }
    int main()
    {
        char str[5];
        sprintf(str, "ABCDEF");
        printf("%s\n", str); // output : ABCDEF
        return 0;
    }

snprintf (char *s, size_t maxlen, const char *format, ...)

    snprintf 多了一個參數去限制寫入長度(包含'\0'),安全許多。另外我是用 gcc 編譯的,snprintf 會回傳寫入字串的長度 (不包含'\0'),所以當回傳值大於等於 maxlen,則代表字串被切了。
    int main()
    {
        int ret;
        char str[5];
        ret = snprintf(str, 5, "ABC");
        printf("%s\n", str); // output : ABC
        printf("%d\n", ret); // output : 3
        return 0;
    }/code>
    int main()
    {
        int ret;
        char str[5];
        ret = snprintf(str, 5, "ABCDEF");
        printf("%s\n", str); // output : ABCD
        printf("%d\n", ret); // output : 6
        return 0;
    }


參考資料:
https://blog.xuite.net/tzeng015/twblog/113272245-snprintf
https://linux.die.net/man/3/snprintf

Related Posts:

  • C 語言 - function pointer 函數指標 function pointer 概念     基本上有 data 的 pointer 就會有 function 的 pointer。 正確的 ( 回傳 int 的 function ) int (*pfi)(); 錯誤的 ( 回傳 int pointer 的 function ) int *pfi(); function pointer 宣告     利用 typedef,… Read More
  • C/C++ - 左值、右值 ( lvalue、rvalue )lvalue、rvalue 基本概念 左值 (lvalue) : 一個佔據某個特定記憶體的值。 右值 (rvalue) : 一個 expression 結束後就消失的值。 基本上這兩個定義包含了全部的值,非左即右,非右即左。 int var = 4; // var 參數佔據記憶體 = lvalue 4 = var; // 4 不佔據記憶體 = rvalue (var + 1) = 4; // var … Read More
  • C/C++ - Function Pointer 應用 CallBack FunctionFunction Pointer 應用 CallBack Function     有了 Function Pointer 就意味著,Callback Function 能被實現。     Callback Function : A 跟 B 講 "看到 C 就打電話給我" 打電話給 A = Callback Function     main.cpp ( A ) … Read More
  • C 語言 - malloc、free 與 calloc malloc 跟 free     一般來說要將函式結果回傳是不能用 pointer,因為一旦函式結束 stack 的空間就會被釋出,所以 pointer 會指向的資料是危險的。這時就會先動態地宣告一個位址給 pointer,但這類的記憶體會被存放在 heap 而非 stack,所以開發者必須自行釋放。 pointer.c void showMalloc(int poi… Read More
  • C 語言 - sprintf / snprintf sprintf (char *s, const char *format, ...)     C 語言並沒有其他語言方便的 container 去作字串轉換,所以 sprintf 就顯得強大許多。原理就是 printf 但輸入到字串。但會有 overflow 的 issue 產生。 int main() { char str[5]; sprintf(str, "ABC"); … Read More

0 意見:

張貼留言

Popular Posts