2009-07-03 15 views
5

Я пишу программу, которая использует отпечатки шестнадцатеричного дампа своего ввода. Тем не менее, я столкнулся с проблемами при переносе строк, вкладок и т. Д. И уничтожении форматирования вывода.Как напечатать ' n' вместо новой строки?

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

EDIT: Я получаю свои данные динамически, это не только то, что я исправлен, но все символы. Например, это мой Printf заявление:

printf("%c", theChar); 

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

+1

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

ответ

36

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

6

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

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

8

Просто используйте "\\ п" (две косые черты)

1

Просто используйте String::replace заменить символы обижая перед вызовом 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); 
} 
+0

Это не так, как работает std :: basic_string :: replace. Из http://en.cppreference.com/w/cpp/string/basic_string/replace мы видим, что replace 'заменит часть строки, обозначенную как [pos, pos + count) или [first, last)', с новую строку. Он не ищет исходную строку и заменяет найденные вхождения. – Jon

22

Функция printchar() ниже будет печатать некоторые символы, как «специальный», и распечатать восьмеричный код для символов из диапазона (a la 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"); 
} 
+2

+1: Хорошая идея на < 20 and > 127 catch –

+3

Должно быть <32 (или 0x20) и> = 127. Также для% o вам нужно отбросить символ в unsigned char (или & 0xff), поскольку char обычно подписывается. – mark4o

+0

Спасибо @ mark4o, вы правы насчет 0x20 и 32. Исправлен мой ответ. –

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

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

3

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

printf("\\n"); 
-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:

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

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

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

Решение 3: уже было сказано выше использование \ п

0

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

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

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