簡體   English   中英

在c中將字符串傳遞給printf

[英]passing a string to printf, in c

將字符串傳遞給printf不能正常工作的代碼:

char p[50];
scanf("%s", p); 
printf(p, 10); 

輸入: value:%d\\n

預期輸出: value:10

輸出: value:10\\n

另外,我在不同的時間得到了不同的輸出。 3次連續執行時,相同a.ou​​t的輸出:

$。/ a.out的

value: %d\n
value:

$。/ a.out的

value:%d\n\n
value:10\n\n

$。/ a.out的

value:%d\n
value:10\n

在上面的value: %d\\n是scanf的結果,下一行是printf的結果

非常小心與通過用戶提供的文本作為第一個參數printf ,或者你將有一個格式化字符串漏洞 此外,通過使用裸scanf ,您還容易受到緩沖區溢出的影響 (僅三行代碼就有兩個漏洞!)

就是說,在輸出中獲得文字\\n的原因是因為在控制台上鍵入\\n時,您會得到一個帶有文字反斜杠的字符串,后跟一個n ,而不是換行符。

另外,請注意scanf停在任何空白處,因此輸入value: xxx將僅產生value:進入緩沖區。 如果您想讀取整行,則應改用fgets類的函數。

您的代碼的行為與預期的完全一樣。 在第一個示例中,您在“ 10”之前傳遞了空格,因此尚未打印。

最簡單的解決方法是使用fgets()而不是scanf():

#include <stdlib.h>
#include <stdio.h>

void main () {
  char p[50];
  fgets(p, 50, stdin);
  //scanf("%s", p);
  printf(p, 10);
}

原因是fgets()僅從stdin中獲得一行,它不在乎該行中的字符。 另一方面,scanf()要求您確切指定將以什么順序出現的字符。

有關更多信息,請參見scanffgets的手冊頁。

暫無
暫無

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

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