Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > помогите ламеру :)


Автор: zzz 3.7.2002, 00:27
народ, у меня назрел тут вопрос - "\n" - это два символа или один?

Автор: Nastya 3.7.2002, 07:09
Один. Как в общем и \0 и другие

По моему

Автор: Вано 3.7.2002, 07:20
А откуда такой вопрос? Это в смысле тебе интересна как надо писать
'/n'  или "/n" т.к.символ один то надо как в первом случае.

Автор: podval 3.7.2002, 11:09
Цитата(Guest @ 03.7.2002, 08:20)
А откуда такой вопрос? Это в смысле тебе интересна как надо писать
'/n'  или "/n" т.к.символ один то надо как в первом случае.

Нет, писать надо "\n", ибо это escape-последовательность, воспринимается, как управляющий символ. См. хелп.

Автор: Baa 3.7.2002, 12:36
"\n" = crlf = (char)0xA, (char)0xD

Автор: zzz 3.7.2002, 16:37
Цитата(Baa @ 03.7.2002, 13:36)
"\n" = crlf = (char)0xA, (char)0xD

а почему тогда вот тут:
char *a = "Hello!\n"
в дампе a в конце только \x0A ??? а \x0D где???

Автор: Baa 3.7.2002, 17:32
Ща тож посморел, тут нету возврата коретки, тут токо перевод строки...у меня спросто были ассоциации с ассемблером, там всегда строки определялись с 0ah и 0dh на конце и посему, я считал, что \n - это именно эквивалент crlf, хотя тут это токо перевод строки.
Так что вполне справедливо следующее:
       char Hello[8];
strcpy (Hello, "Hello!");
Hello[6] = '\n';
Hello[7] = '\0';
printf (Hello);
Т.е. \n -это один символ.

Автор: Wowa 3.7.2002, 23:17
Цитата(Baa @ 03.7.2002, 16:32)
тут нету возврата коретки, тут токо перевод строки...

А есть разница?  :hehe

Автор: Vit 4.7.2002, 03:18
Есть разница - стандарт DOS/Windows 13h 10h - конец строки и перевод каретки, хотя в 99% случаев только один символ тоже воспринимается корректно. Под Linux/Unix стандарт  - только 13h (черт, забыл! - может и 10h - короче один из них)...

Автор: Temnozor 5.7.2002, 08:34
Проблема затронута довольно серьезная. Я воевал с нечто подобным, разбираться было особо некогда и оставил все как есть. Может сейчас разрешим?
Есть строка в ресурснике:
Код

STRINGTABLE DISCARDABLE
BEGIN
   IDS_P_CONTENT              "<html>\n\n<head>\n<meta http и так далее"
END

Ее я выдаю в файл (создаю html-ку):
Код

FILE* file = fopen(filename, "w");
fputs((CString)MAKEINTRESOURCE(IDS_P_CONTENT), file);

Все работает. Я бы не заметил проблемы, если бы не открыл однажды получившуюся html-ку в FrontPage. Мамочка моя! Вместо двух переходов на новую строку в редакторе FrontPage'а стало четыре, вместо одного - два.
Открываю html-ку в бинарном виде, и точно:
Код
3C 68 74 6D 6C 3E 0D 0D 0A 0D 0D 0A 3C 68 65 61 64 3E 0D 0D 0A 3C 6D ...

И кто мне объяснит все это? В чем я согрешил?
P.S. Может за одно подскажете можно ли покрасивее написать тоже самое вместо (CString)MAKEINTRESOURCE(IDS_P_CONTENT)?

Автор: Baa 5.7.2002, 12:55
Ответ прост :) он исходит из кода. В своем коде ты использовал функции fputs и т.д. Они используют старый стандарт(DOS), в котором \n определен как 0Ah+0Dh
Используй функции Windows и все будет ок ;)
HANDLE hFile = CreateFile ("c:\\test.TxT",
GENERIC_WRITE,
NULL,
NULL,
CREATE_NEW,
FILE_ATTRIBUTE_NORMAL,
NULL);
char* pszBuffer = new char [0xFF];
memset (pszBuffer, 0, 0xFF);
LoadString (theApp.m_hInstance, IDS_STRING102, pszBuffer, 0xFF);
DWORD dwBytesWritten = 0;

WriteFile (hFile, pszBuffer, strlen(pszBuffer), &dwBytesWritten, NULL);
CloseHandle (hFile);


Автор: Fantasist 6.7.2002, 11:45
Вопрос известен. Приколов с ним всегда хватало, пока не привыкнешь.
Конечно, символ '\n' один, как и просто 0D, но многие функции записи данных контролируют это дело, и считают своим долгом добавить к нему еще и символ 0A. Или наоброт... к 0А добавить 0D. А может и так и так.

Автор: Alex101 10.7.2002, 23:11
С этим лучше не париться, а просто посмотреть, что получится...
Например, попробуйте в билдере открыть в ричэдите текстовый файл ДОС.
Он в конце каждой строки будет выдавать символ 0x0A
По идее, "\n" - это 0x0D....

Автор: a__drake 11.7.2002, 06:12
Цитата(Alex101 @ 11.7.2002, 00:11)
С этим лучше не париться, а просто посмотреть, что получится...
Например, попробуйте в билдере открыть в ричэдите текстовый файл ДОС.
Он в конце каждой строки будет выдавать символ 0x0A
По идее, "\n" - это 0x0D....

Доброе время суток!

Если ещё не разобрались, то...

>>По идее, "\n" - это 0x0D....

\n == 0x0A
\r == 0x0D

функции printf/fprintf/puts/fputs автотматически заменяют \n на последовательность \r\n (это не компилятор делает!)
В Досе конец строки обозначается _двумя_ символами, а именно \r\n
BTW, функции cprintf/cputs (кто помнит turbo-C для ДОС? ;-) ) этого не делают.
Что же качается разницы м/д '\n' и "\n" -- первое имеет тип char, второе char[2] (в конце ещё '\0' добавляется)

Всего наилучшего!

ЗЫ. В Унихе функция printf "\n" на "\r\n" не меняет. К чему бы это? ;-)

Автор: crimaniak 12.7.2002, 15:24
Ох уж эти чайники!  :)

\r=0x0A, \n=0x0D

Если поток открыт в _текстовом режиме_ (а stdout именно в тесктовом режиме), то \n транслируется в \r\n.

cr - возврат каретки (каретка переводится в начало _этой же_ строки)
nl - переход на новую строку (в той же позиции).


Если система
            не транслирует \n
                              то вы можете увидеть
                                                   вот такой текст.

Автор: crimaniak 12.7.2002, 15:29
Поправка: А и Д поменять... Но это неважно

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)