2016-04-14 3 views
5

Эта часть кода действует немного странно на мой вкус. Пожалуйста, кто-нибудь хочет объяснить, почему? И как заставить «\ n» интерпретироваться как особый символ?Интерпретация ' n' в printf ("% s", строка)

[email protected]:~/tmp/user/foo/bar$ ./interpretastring.x "2nd\nstr" 
1st 
str 
2nd\nstr 
[email protected]:~/tmp/user/foo/bar$ cat interpretastring.c 
#include <stdio.h> 

int main(int argc, char **argv) 
{ 
    char *s="1st\nstr"; 

    printf("%s\n", s); 
    printf("%s\n", argv[1]); 

    return 0; 
} 

Подводя итог, предполагается, что вторая строка будет напечатана в двух строках, как и первая. Эта программа является упрощением. У реальной программы есть проблемы с чтением из файла с помощью fgets (а не аргумент S.O. для argv, как здесь), но я думаю, что решение здесь также решит.

+4

Экраны обратной косой черты значительны в исходном коде C * *, но они не важны для 'printf', а не' fgets' и других функций библиотеки времени выполнения C. Аргументы командной строки могут получить обратную косую черту, преобразованную в что-то еще * оболочкой *, но вы не можете рассчитывать на это, и не можете рассчитывать на то, что она согласуется с тем, что делает компилятор C для строковых литералов. Если вы хотите перевести символ '\ n' на символ новой строки во вводной информации вашей программы, вам придется сделать это самостоятельно, вручную. – zwol

+0

Спасибо. Очень уместный комментарий. Может быть, есть такая функция уже в обширной библиотеке C? –

+1

С сожалением могу сказать, что такой функции нет. – zwol

ответ

0

Для всех целей это просто позаботится о \n, и никакие другие персонажи не получат специального лечения.

Этот ответ здесь выполняет работу с меньшей степенью сложности. Он не меняет «2 символа» на «один специальный \n». Он просто меняет <\><n> на "<space><newline>". Хорошо. Было бы лучше, если бы был C Standard Library для интерпретации специального chars в строке (как я знаю, он имеет для RegExp, например).

/* change '\\n' into ' \n' */ 
void changebarn(char *nt) 
{ 
    while(nt!=NULL) 
     if((nt=strchr(nt,'\\'))) 
      if(*++nt=='n') 
      { 
       *nt='\n'; 
       *(nt-1)=' '; 
      } 
} 
+1

Конечно, теперь вам нужно беспокоиться о том, что хотите передать '\', а затем 'n' как литералы, а не символы новой строки. Это означает, что вам нужно разрешить обратную косую черту, чтобы сбежать, поэтому вы можете передать '' foo \\ nbar'' и получить 'foo \ nbar' как литералный вывод с обратной косой чертой и' n', а не новой строкой. – ShadowRanger

+0

Привет @ShadowRanger, я подумал об этом, прежде чем писать этот код. Ваш комментарий очень важен для тех, кто читает этот ответ. Что касается меня, мой вход не имеет буквального '' \\ n "'. Единственный специальный символ, который мне нужно интерпретировать, это просто '' \ n'', а '' \\ n "' будет считаться как '<\>< ><\n>', без проблем. Спасибо за это. +1. –

1

Кажется, что оболочка не распознает и не конвертирует «escape-последовательность». Используйте программное обеспечение оболочки, которое поддерживает escape-последовательность \n.

+0

Это решение не касается моей проблемы. Я не хочу, чтобы третьи части интерпретировали «\ n». Кстати, я также прокомментировал вопрос о чтении строки из файла с помощью 'fgets()'. –

+0

Значит, вам нужен код, который интерпретирует буквальные 2 символа '\' и 'n' в один символ новой строки, но вы специально не хотите, чтобы для этого был нужен сторонний код? – brycem

+0

Вы не можете попросить меня изменить свой API для решения проблемы. Строка, которую я получаю, такова, и все. Я должен иметь дело с этим в своем собственном коде (или в библиотеке C). Во всяком случае, это простая проблема. Мой вопрос больше о том, есть ли библиотека C, которая интерпретирует строку. –