Как я могу избавиться от "\ n" из строки в c? - PullRequest
7 голосов
/ 09 марта 2012

Я использую функцию ascitime в C

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

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

Возвращает эту "строку" (соотв. Char *):

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

Как мне избавиться от "\ n" из этой строки?Я не хочу следующую строку, которая вызывает "\ n".Thx

Ответы [ 6 ]

17 голосов
/ 09 марта 2012

Другие ответы кажутся слишком сложными. Ваш случай прост, потому что вы знаете, что нежелательный символ является последним в строке.

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

Это обнуляет последний символ (\ n).

3 голосов
/ 18 сентября 2014

после принятия ответа

принятый ответ кажется слишком сложным. 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';

str[strlen(str) - 1] небезопасен до первого установления strlen(STR) > 0.

1 голос
/ 27 августа 2014

почему бы не использовать 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 голосов
/ 10 марта 2017

Если вы хотите сделать это с 1 строкой кода:

printf("The time is: %s.", strtok(asctime(timeinfo), "\n"));
0 голосов
/ 09 марта 2012

Насколько я знаю, вы не можете заставить его вернуть строку без перевода строки.Вам нужно просто снять \n с некоторой базовой цикличностью.

int i;

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

В качестве альтернативы, вы можете прочитать информацию вручную из tm struct.

0 голосов
/ 09 марта 2012

вы можете использовать strtok, чтобы разбить строку на "\n" и объединить токены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...