1

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

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"

我知道我可以修改字符串以摆脱空终止符换行符,但如果可能的话,我想在不修改字符串的情况下实现此输出。

是否可以?

4

4 回答 4

8

这与空终止符无关。字符串 必须以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必须提供,它需要保存要打印的字符串的长度,(没有换行符)

于 2015-05-15T13:43:06.437 回答
6

正如已经指出的,C 中的每个字符串都应该以 null 结尾(否则 - 怎么printf知道字符串的结尾?)

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

试试这个:

  char* first_newline = strchr(str, '\n');
  if (first_newline)
      *first_newline = '\0';

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

于 2015-05-15T13:46:45.677 回答
1

编辑:看看这个;)

如何仅打印字符串的某些部分?

您只需要打印 'strings lenths - 1' 字符

于 2015-05-15T13:42:16.337 回答
1

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

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

size_t n = strlen( str );

if ( n && str[n-1] == '\n' ) str[n-1] = '\0';
于 2015-05-15T13:55:25.987 回答