2013-02-27 83 views
0

傳遞串給printf工作不正常 代碼:傳遞字符串給printf,在C

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

輸入:value:%d\n

預期輸出:value:10

輸出:value:10\n

也,我在不同的時間得到不同的輸出。相同的a.out的輸出在3個連續執行:

$/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

+1

我不相信你的代碼和例子的輸出。文本「值」出現在輸出中,但不在代碼中。你*鍵入*'價值'? – unwind 2013-02-27 07:34:22

+1

@unwind它出現在輸入中。他將輸入作爲第一個參數傳遞給'printf' – 2013-02-27 07:36:13

+1

它是否像將用戶輸入字符串直接傳遞給'printf'一樣糟糕? – 2013-02-27 07:37:36

回答

4

真的小心通過用戶提供的文本作爲第一個參數printf,或者你將有一個格式化字符串漏洞。此外,通過使用裸露的scanf,您也容易受到緩衝區溢出的影響。 (兩個漏洞中只有三行代碼!)

這就是說,你爲什麼在你的輸出得到一個字面\n的原因是因爲當你在控制檯輸入\n,你會得到一個反斜槓後跟一個字符串n,而不是一個換行符。

另外,還要注意scanf停在任何空白,在value: xxx所以打字只會造成value:進入緩衝區。如果你想讀整行,你應該使用像fgets這樣的函數。

0

您的代碼的行爲完全按照它的設想。在你的第一個例子中,你在「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()得到簡單的一行從標準輸入,它並不關心是什麼人物那條線。另一方面,scanf()要求您明確指定哪些字符將以哪種順序顯示。

有關更多信息,請參閱手冊頁scanffgets