簡體   English   中英

我如何在c中打印

[英]how can I printf in c

如何在不使用兩次printf調用的情況下正確進行此打印?

char* second = "Second%d";
printf("First%d"second,1,2);

您顯示給我們的代碼在語法上是無效的,但是我想您想執行與以下操作具有相同效果的操作:

printf("First%dSecond%d", 1, 2);

如您所知, printf的第一個參數是格式字符串。 不必一定是字面意義。 您可以按自己喜歡的任何方式構建它。

這是一個例子:

#include <stdio.h>
#include <string.h>
int main(void)
{
    char *second = "Second%d";
    char format[100];
    strcpy(format, "First%d");
    strcat(format, second);

    printf(format, 1, 2);

    putchar('\n');
    return 0;
}

一些注意事項:

我在輸出之后添加了換行符。 輸出文本(幾乎)應始終由換行符終止。

我為格式字符串設置了100個字節的任意大小。 一般來說,您可以聲明

char *format;

並通過調用malloc()對其進行初始化,分配您實際需要的大小(並通過返回空指針來檢查malloc()未表示失敗); 然后,您想調用free(format); 完成后。

正如templatetypedef在評論中說的那樣,如果格式字符串來自不受控制的來源,則這種事情可能具有潛在的危險。

(或者您可以只調用兩次printf ;這並不比一次調用昂貴得多。)

char *second = "Second%d";
char tmp[256];
memset(tmp, 0, 256);
sprintf(tmp, second, 2);
printf("First%d%s", 1,tmp);

或類似的東西

使用預處理器來連接兩個字符串。

#define second "Second%d"
printf("First%d"second,1,2);

不要在真實程序中執行此操作。

char *second = "Second %d";
char *first = "First %d";
char largebuffer[256];

strcpy (largebuffer, first);
strcat (largebuffer, second);
printf (largebuffer, 1, 2);

使用生成的格式(例如上述方法)的問題在於,由於printf()函數是可變長度的參數列表,因此無法知道所提供的參數數量。 它的作用是使用提供的格式字符串,並使用格式字符串中描述的類型,然后它將從參數列表中選擇該數字和參數類型。

如果像上面的示例中那樣提供了正確數量的參數,其中有兩種%d格式,並且在這些位置提供了兩個要打印的整數,那么一切都很好。 但是,如果您執行以下操作,該怎么辦:

char *second = "Second %s";
char *first = "First %d";
char largebuffer[256];

strcpy (largebuffer, first);
strcat (largebuffer, second);
printf (largebuffer, 1);

在此示例中,printf()函數使用格式字符串以及可變數量的參數。 格式字符串表示將有兩個附加參數,一個整數和一個零終止字符串。 但是,僅提供了一個附加參數,因此printf()函數將使用堆棧上的下一個作為指向零終止字符串的指針。

如果幸運的話,printf()函數解釋為指針的數據將為您的應用程序提供有效的內存地址,並且指向的內存區域將是幾個以零結尾的字符。 如果您不太幸運,則指針將為零或亂碼,然后您將立即獲得訪問沖突,並且很容易找到導致應用程序崩潰的原因。 如果您根本沒有運氣,那么指針將足夠好,它將指向一個大約2K個字符的有效地址,結果是printf()會完全弄亂您的堆棧並進入雜草,結果崩潰數據將毫無用處。

我假設您想要輸出:

First 1 Second 2

為此,我們需要更好地了解printf的功能。 printf之所以如此有用的真正原因是,它不僅可以打印字符串,還可以為您格式化變量。 根據您希望變量格式化的方式,您需要使用不同的格式化字符。 %d告訴printf將變量格式化為帶符號的整數,您已經知道。 但是,還有其他格式,例如%f表示浮點數和雙精度數, %l%表示長整數, %s表示字符串,或char*

使用%s格式字符打印char*變量second ,我們的代碼如下所示:

char* second = "Second";
printf ( " First %d %s %d ", 1, second, 2 );

這告訴printf您希望第一個變量格式化為整數,第二個變量格式化為字符串,第三個變量格式化為另一個整數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM