【问题标题】:How to print a string using printf without it printing the trailing newline如何使用 printf 打印字符串而不打印尾随换行符
【发布时间】:2015-05-15 13:40:24
【问题描述】:

我正在尝试使用 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 终止符 换行符,但如果可能的话,我想在不修改字符串的情况下实现此输出。

有可能吗?

【问题讨论】:

  • “空终止符”?您不是指包含的换行符吗?
  • 它们不是以null结尾的,它们的末尾有一个直线字符
  • 抱歉,我是编程新手。我认为 \n 是空终止符
  • @ForceBru 我认为您的话有点具有误导性,它们空终止的,并且在空终止之前有一个\n,恕我直言:-)
  • @SouravGhosh,是的,你当然是对的。我的意思是,空终止不是这里的问题。

标签: c string printf null-terminated


【解决方案1】:

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

【讨论】:

  • 抱歉,我是编程新手。我认为 \n 是空终止符
  • @Tiagofer 没关系,发生了。顺便说一句,你应该检查我更新的答案。 :-)
  • 我不得不离开一段时间,所以我现在才有机会查看您更新的答案。太棒了,谢谢! :D
【解决方案2】:

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

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

试试这个:

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

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

【讨论】:

  • @iharob 对,但不知何故,它没有按照 OP 的要求回答问题 without modifying the strings。但话又说回来,它被接受了,所以.. 和平 :-)
【解决方案3】:

编辑:看看这个;)

How to print only certain parts of a string?

你只需要打印'strings lenths - 1' characters

【讨论】:

    【解决方案4】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-08
      • 2011-11-07
      • 1970-01-01
      • 1970-01-01
      • 2015-10-17
      • 2021-01-30
      • 1970-01-01
      相关资源
      最近更新 更多