2013-06-04 143 views
2

我的問題是如何創建一個格式字符串,其中包含整行文本(包括嵌入空格)?如何使用fprintf打印一個文本行(包括空格)

我有一個緩衝區定義

char buf[380];

當我在一行文本閱讀,我確保buf[378] = '\n';和`BUF [379] = '\ 0';」

我編輯一個緩衝區,然後使用fprintf將其寫入到一個已經打開的文件:

fprintf(outfile, buf);

我得到編譯時,這樣的警告:

ex_split.c: In function ‘main’: 
ex_split.c:65:3: warning: format not a string literal and no format arguments [-Wformat-security] 

,我不挺確定如何編寫格式化字符串,以便可以編寫所有的buf,因爲,正如我記得的那樣,%s將停留在第一個空間,並且這些數據中有很多空格,這是我需要的。它是位置格式化的數據。

附錄

讓我重申這個問題。我相信%s會導致fprintf在每行數據中的第一個0x20字符處停止掃描,其中有一個或多個空間和非空間可讀的ASCII數據。我的假設是否正確?

回答

3

%s作爲scanf格式的一部分進行掃描時,在作爲printf格式的一部分進行掃描時不在空格處停止。 fprintf(outfile, "%s", buf);將爲你工作得很好。

如果你確定你的buf字符串是安全的 - 也就是說,它不包含任何%逃逸可能導致printf不確定的行爲,你也可以忽略/在這種情況下,禁用警告。

+1

如果您「知道」該字符串是安全的,那麼您總有可能錯了。使用'「%s」'可以減少您擔心的錯誤。或者,由於OP實際上不需要格式化任何東西,'fputs(s,outfile);'可能是更好的解決方案。 –

+0

我想要清除警告,這就是爲什麼我問這個問題。而奇怪的是,在CentOS 5上,我沒有得到明顯不同於Ubuntu 12.04的gcc版本的警告。 – octopusgrabbus

1

變化

fprintf(outfile, buf); 

fprintf(outfile, "%s", buf); 

,並預期它會奏效。

+0

OP知道,他只是不認爲它會起作用。 –

+0

@CarlNorum所以,OP知道「它會按預期工作」,但「不認爲它會工作」? ;-) – twalberg

+0

@CarlNorum你說得對。謝謝。 – octopusgrabbus

相關問題