2013-06-04 212 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

相关问题