我正在尝试使用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终结符换行符,但是如果可能的话,我想要一种方法来实现这个输出而不修改字符串。
有可能吗?
答案 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)
答案 3 :(得分:1)
您似乎使用标准函数str
(或其他一些方法)读取数组fgets
中的数据,该函数在字符串中还包含与Enter键相对应的换行符'\n'
你应该删除这个角色。这可以通过以下方式完成
size_t n = strlen( str );
if ( n && str[n-1] == '\n' ) str[n-1] = '\0';