1. 程式人生 > >%s %*s

%s %*s

// 在C 語言中輸出等寬度的顯示我們一般採用的是在前面加數字的方法,
    printf("%30s\n", the_text);        // 右對齊輸出,結果:"            this is test text!"
    printf("%-30s\n", the_text);       // 左對齊輸出,結果:"this is test text!            "

    // 其實C 語言還對printf() 提供了一種動態新增的方法,也就是可以使用變數的方法來
    //         設定該寬度,這樣就大大提高了等寬度輸出的靈活性。

    const char text_char[]             = "char";
    const char text_char_var[]         = "m_ch_var";
    const char text_char_ptr[]         = "m_ch_ptr";
    const char text_int32[]            = "int32_t";
    const char text_int32_var[]        = "m_nvar";
    const char text_int32_ptr[]        = "m_pvar";

    printf("%s %*s%s;\n", text_char,  20 - strlen(text_char),  "", text_char_var);
    printf("%s*%*s%s;\n", text_char,  20 - strlen(text_char),  "", text_char_ptr);
    printf("%s %*s%s;\n", text_int32, 20 - strlen(text_int32), "", text_int32_var);
    printf("%s*%*s%s;\n", text_int32, 20 - strlen(text_int32), "", text_int32_ptr);
    // (13 + ...) 的結果是"std::vector<%s>" 的總位元組寬度
    printf("std::vector<%s> %*s%s;\n", 
        text_char, 20 - (13 + strlen(text_char)), "", "m_vec_var");

    /*
    // 輸出的結果如下:
    char                 m_ch_var;
    char*                m_ch_ptr;
    int32_t              m_nvar;
    int32_t*             m_pvar;
    std::vector<char>    m_vec_var;
    */


    // 對於字串而言,還可以使用"%.*s" 限制輸出字串的最大長度,即:可以將"char", 限制只輸出"ch",或者"cha".
    printf("%.*s, end.\n", 1, the_text);
    printf("%.*s, end.\n", 2, the_text);
    printf("%.*s, end.\n", 3, the_text);
    printf("%.*s, end.\n", 8, the_text);

    /*
    // 輸出結果如下:
    t, end.
    th, end.
    thi, end.
    this is , end.
    */

    // 同時在前面再加上一個* 就跟上面的意義一樣,設定輸出寬度
    printf("%*.*s, end.\n", 10, 1, the_text);
    printf("%*.*s, end.\n", 10, 2, the_text);
    printf("%*.*s, end.\n", 10, 3, the_text);
    printf("%*.*s, end.\n", 10, 8, the_text);

    /*
    // 輸出結果如下:
             t, end.
            th, end.
           thi, end.
      this is , end.
    */

    // 以上的方法同樣可針對浮點數,特別是"%*.*lf",應該特別有用。

    return 0;