如何使用printf打印字符串而不打印尾部换行符

时间:2015-05-15 13:40:24

标签: c string printf null-terminated

我正在尝试使用printf()打印一些字符串但是它们是 null终止具有尾随换行符并且与格式化混淆:

printf("The string \"%s\" was written onto the file \"%s\"", str, fname);

假设字符串包含"The Racing car.",文件名为"RandomText1.txt" 这打印:

The string "The Racing car.
" was written onto the file "RandomText1.txt
"

但我希望它只用一行打印:

The string "The Racing car." was written onto the file "RandomText1.txt"

我知道我可以修改字符串以摆脱 null终结符换行符,但是如果可能的话,我想要一种方法来实现这个输出而不修改字符串。

有可能吗?

4 个答案:

答案 0 :(得分:7)

这与null终止符无关。 字符串 必须以空值终止。

您在此处遇到跟踪换行符(\n)的问题。在将字符串传递给printf()之前,您必须剥离该换行符。

最简单的方法[需要修改str ]:您可以使用strcspn()执行此操作。伪代码:

str[strcspn(str,"\n")] = 0;
  

如果可能的话,在不修改字符串的情况下实现此输出。

是的,也可能。在这种情况下,您需要使用printf()长度修饰符来限制要打印的数组的长度,例如,

printf("%15s", str);  //counting the ending `.` in str as shown

但恕我直言,这不是最好的方法,因为必须知道并修复字符串的长度,否则,它将无效。

一个灵活的小案例,

printf("%.*s", n, str);

其中,必须提供n并且需要保持要打印的字符串的长度(不使用换行符)

答案 1 :(得分:5)

正如已经指出的那样,C中的每个字符串都应该以空值终止(否则 - SELECT SH.state_Added_time, SH.Entity_Id, SH.State_Id FROM state_history SH INNER JOIN ( SELECT max(state_added_Time) MT, entity_ID FROM state_history WHERE state_Added_Time <= '2015-05-15 14:25:00' GROUP BY entity_Id) B on B.MT=Sh.State_Added_time and B.Entity_ID=SH.Entity_ID 如何知道字符串的结束位置?)

您需要在数组中搜索换行符,大概是使用strchr

试试这个:

printf

它将在换行符的第一个实例处终止字符串。

答案 2 :(得分:1)

编辑:看看这个;)

How to print only certain parts of a string?

你只需打印'字符串lenths - 1'字符

答案 3 :(得分:1)

您似乎使用标准函数str(或其他一些方法)读取数组fgets中的数据,该函数在字符串中还包含与Enter键相对应的换行符'\n'

你应该删除这个角色。这可以通过以下方式完成

size_t n = strlen( str );

if ( n && str[n-1] == '\n' ) str[n-1] = '\0';