![](/img/trans.png)
[英]If printf(“%c%c”,'A',8); deletes A, why can't printf(“%c%c”,'\n',8); delete new line? How can I do it?
[英]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.