Вопрос по c++ – Как напечатать '\ n' вместо новой строки?

6

Я пишу программу, которая использует печатает шестнадцатеричный дамп своего ввода. Однако я сталкиваюсь с проблемами, когда передаются символы новой строки, вкладки и т. Д., Которые разрушают мое форматирование вывода.

Как я могу использовать printf (или, я думаю, cout), чтобы печатать \ n? вместо печати фактического перевода строки? Мне просто нужно сделать ручной анализ для этого?

РЕДАКТИРОВАТЬ: я получаю свои данные динамически, это не только \ n, о котором я пишу, а скорее все символы. Например, это мой оператор printf:

printf("%c", theChar);

Как я могу сделать этот вывод \ n, когда символ новой строки передается как theChar, но все равно заставляет его печатать обычный текст, когда theChar является допустимым печатаемым символом?

Помните, что ни один вызов printf ("% c", foo) не может вывести \ n, строку из двух символов. Вы в основном должны выбирать между изменением ввода (замена "\ n" на "\\ n") или старым добрым if (theChar == '\ n'). ojrac

Ваш Ответ

11   ответов
1

В C ++ 11 вы также можете использовать необработанные строки

std::printf(R"(\n)");

все внутриR"( а также)" будет печататься буквально. escape-последовательности не будут обработаны.

8

6

чтобы она печаталась просто как обычная обратная косая черта:"\\n".

Редактировать: Да, вам придется сделать ручной анализ. Однако код для этого будет просто искать и заменять.

5

что вы не печатаете никаких непечатаемых символов, вы можете использовать функции вctype.h нравитсяisprint:

if( isprint( theChar ) )
  printf( "%c", theChar )
else
  switch( theChar )
  {
  case '\n':
     printf( "\\n" );
     break;
  ... repeat for other interesting control characters ...
  default:
     printf( "\\0%hho", theChar ); // print octal representation of character.
     break;
  }
3

\' зарезервирован как escape-символ. Поэтому, когда вы действительно хотите напечатать '\', вы должны ввести '\'. Таким образом, чтобы вывести фактическое значение '\ n', вы должны напечатать следующее:

printf("\\n");
1

String :: заменить чтобы заменить оскорбительные символы перед вызовом printf.

Вы можете обернуть printf, чтобы сделать что-то вроде этого:

void printfNeat(char* str)
{
    string tidyString(str);
    tidyString.replace("\n", "\\n");
    printf(tidyString);
}

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

[Редактировать или, если вы хотите использовать аргументы, попробуйте это:

void printfNeat(char* str, ...)
{
    va_list argList;
    va_start(argList, msg);

    string tidyString(str);
    tidyString.replace("\n", "\\n");
    vprintf(tidyString, argList);

    va_end(argList);
}
Это не то, как работает std :: basic_string :: replace. От En.cppreference.com / ж / CPP / строка / basic_string / заменить мы видим, что заменитьwill replace the part of the string indicated by either [pos, pos + count) or [first, last) с новой строкой. Он не ищет исходную строку и не заменяет найденные вхождения. Jon
-2

Решение 1: Каждый символ, число, алфавит имеет свое собственное значение ASCII. Значение ASCII '\' как 92 и 'n' как 110. Непосредственные значения (числа (ASCII)) хранятся в двух целочисленных переменных. При печати используется спецификатор формата% c (Символ).

void main() { 
    int i=92, j=110; 
    clrscr(); 
    printf("%c%c", i, j);
    getch();
}

Попробуйте в программном обеспечении C ...

Решение 2:

Программы работают. Но я думаю, что это нечестно ... На экране вывода введите ввод как \ n ... вы получите еще один \ n ..

void main() {
  char a[10];
  gets(a);
  printf("\n\n\n\n");
  puts(a);
  getch(); 
}

Попробуйте программы

Решение 3: уже говорилось выше использовать \ n

22

Функцияprintchar() ниже напечатает некоторые символы как «специальные», и напечатает восьмеричный код для символов вне диапазона (а-ля Emacs), но в противном случае напечатает нормальные символы. Я также взял на себя смелость'\n' распечатать настоящий'\n' после этого, чтобы сделать вывод более читабельным. Также обратите внимание, что я используюint в цикле вmain просто чтобы иметь возможность перебирать весь диапазонunsigned char. При использовании вы, скорее всего, простоunsigned char что вы читаете из своего набора данных.

#include <stdio.h>

static void printchar(unsigned char theChar) {

    switch (theChar) {

        case '\n':
            printf("\\n\n");
            break;
        case '\r':
            printf("\\r");
            break;
        case '\t':
            printf("\\t");
            break;
        default:
            if ((theChar < 0x20) || (theChar > 0x7f)) {
                printf("\\%03o", (unsigned char)theChar);
            } else {
                printf("%c", theChar);
            }
        break;
   }
}

int main(int argc, char** argv) {

    int theChar;

    (void)argc;
    (void)argv;

    for (theChar = 0x00; theChar <= 0xff; theChar++) {
        printchar((unsigned char)theChar);
    }
    printf("\n");
}
условие для верхней границы должно быть> = 0x7f вместо> 0x7f. 0x7f символ представляет удаление, которое не для печати символ truthseeker
Спасибо @ mark4o, вы правы насчет 0x20 и 32. Исправил мой ответ. Jared Oberhaus
Должно быть <32 (или 0x20) и> = 127. Также для% o вам необходимо преобразовать theChar в unsigned char (или & 0xff), так как char обычно подписан. mark4o
+ 1: хорошая идея для ловли <20 и> 127 Jon Cage
36

\\ n" - "\\" создает "\", а затем "n" распознается как обычный символ. Для получения дополнительной информации см.Во.

4
printf("\\n");
3

предоставленным другими людьми, вы должны посмотреть на функции классификации символов, такие какisprint () а такжеiscntrl (). Их можно использовать для определения того, какие символы являются или не могут быть напечатаны, без необходимости жестко кодировать шестнадцатеричные значения из таблицы ascii.

Похожие вопросы