如何在 C 语言中去除字符串中的 "\n"?

13

我在C中使用ascitime函数

   #include <time.h>
    char *asctime(const struct tm *timeptr);

    returns something like:
    Sun Sep 16 01:03:52 1973\n\0

它返回这个“字符串”(或者字符 *):

Sun Sep 16 01:03:52 1973\n\0

我该如何去掉这个字符串中的 "\n"?我不想要造成"\n"的换行。谢谢。


标题暗示需要一个通用解决方案来“从字符串中去除“\n””,但是示例代码和被接受的答案只适用于一个狭窄的条件asctime() - chux - Reinstate Monica
6个回答

26

其他答案看起来过于复杂。你的情况很简单,因为你知道不想要的字符是字符串中的最后一个字符。

char *foo = asctime();
foo[strlen(foo) - 1] = 0;

这会将最后一个字符(\n)设置为 null。


2
仅适用于倒数第二个字符为 \n 而不是任意的 \n 字符。 - twain249
2
@blueshift 是的,这真的是我所需要的,因为我在服务器日志中使用它作为消息之前的时间戳。非常感谢;-) - user1097772

5

接受答案后

接受的答案 看起来过于复杂。asctime() 返回一个长度为26的固定大小数组的指针,格式为:

> Sun Sep 16 01:03:52 1973\n\0 
> 0123456789012345678901234455

char *timetext = asctime(some_timeptr);
timetext[24] = '\0';   // being brave (and foolish) with no error checking  

去除可能存在的(尾部)'\n' 的通用解决方案,适用于更加复杂的字符串:

char *some_string = foo();

char *p = strchr(str, '\n');  // finds first, if any, \n
if (p != NULL) *p = '\0';

// or

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

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

str[strlen(str) - 1]在确定strlen(str) > 0之前是不安全的。


1
据我所知,你无法使其返回没有换行符的字符串。你需要使用一些基本的循环来去掉 \n
int i;

for(i = 0;; i++) {
  if(str[i] == '\n') {
    str[i] = '\0';
    break;
  }
}

或者,您可以从tm结构中手动读取信息。


只有在没有需要保留的 '\n' 后面有任何字符的情况下,这才有效。 - twain249
1
不要重复循环。最好不使用strlen来完成此操作,或者像blueshift建议的那样做可能会更好。 - David Heffernan
无需循环,您知道 \n 是最后一个字符。 - blueshift

1
为什么不使用带有最大宽度的printf?既然你已经调用了printf...
static void debug_printf(const char *format, ...)
{
    va_list arglist;

    time_t rawtime;
    struct tm * timeinfo;

      time ( &rawtime );
      timeinfo = localtime ( &rawtime );

      printf ( "%.24s: ", asctime (timeinfo) );

    va_start( arglist, format );
    vprintf( format, arglist );
    va_end( arglist );
}

0

你可以使用 strtok 函数在 "\n" 上分割字符串,然后将标记连接起来。


我知道在这种情况下它是一个 char *,但那是因为 strtok 函数期望一个 const char * 作为参数。'\n' 字符将无法作为参数使用。但是为了避免混淆,我会删除单词 "character"。 - twain249

-1
如果你想用一行代码完成它:
printf("The time is: %s.", strtok(asctime(timeinfo), "\n"));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接