#c #printf #line-breaks
#c #printf #разрывы строк
Вопрос:
Допустим , у нас есть char* str = "Hello world!n"
. Очевидно , что когда вы распечатаете это , вы увидите Hello world!
, но я хочу сделать так , чтобы оно печаталось Hello world!n
. Есть ли какой-нибудь способ напечатать строку с включенными в нее символами разрыва строки?
Редактировать: я хочу печатать Hello world!n
без изменения самой строки. Очевидно , я мог бы просто сделать char* str = "Hello world \n"
.
Кроме того, причина, по которой я задаю этот вопрос, заключается в том, что я использую fopen для открытия текстового файла с множеством разрывов строк. После преобразования файла в строку я хочу разделить строку на каждый из ее разрывов строк, чтобы я мог изменять каждую строку по отдельности.
Комментарии:
1. придирка: Вы имеете в виду не «включено», а скорее «заменено чем-то видимым», возможно, «экранировано». Они всегда «включаются», но только в буквальной форме, которая вам здесь не нужна.
2. @underscore_d Да, именно это я и имею в виду.
3. Здесь… больше, чем один вопрос… Это немного сбивает с толку. Чтобы уточнить, ваш вопрос заключается в следующем: учитывая строку из текстового файла, напечатать текст с экранированными символами перевода строк?
4. Вы всегда можете написать свою собственную
Myprintf(char *)
функцию, проверяя значение каждого символа…5. Что касается вашей причины задать вопрос, вы можете просто разделить строку на каждый из символов
'n'
(новой строки) напрямую, не заменяя новые строки escape-последовательностями.
Ответ №1:
Я думаю, что это типичный случай проблемы XY: вы спрашиваете о конкретном решении, не сосредотачиваясь сначала на исходной проблеме.
После преобразования файла в строку
Как вы думаете, почему вам нужно читать весь файл сразу? Обычно в этом нет необходимости.
Я хочу разделить строку на каждый из ее разрывов строк, чтобы я мог изменять каждую строку по отдельности.
Вам не нужно печатать строку, чтобы сделать это (вы хотели «сделать так, чтобы она печаталась Hello World!n
«). Вам не нужно изменять строку. Вам просто нужно прочитать его построчно! Вот для чего fgets
это нужно:
void printFile(void)
{
FILE *file = fopen("myfile.txt", "r");
if (file) {
char linebuf[1024];
int lineno = 1;
while (fgets(linebuf, sizeof(linebuf), file)) {
// here, linebuf contains each line
char *end = linebuf strlen(linebuf) - 1;
if (*end == 'n')
*end = ''; // remove the 'n'
printf("]:%s\nn", lineno , linebuf);
}
fclose(file);
}
}
Я хочу сделать так, чтобы он печатался
Hello world!n
Если бы вы действительно хотели это сделать, вам пришлось бы перевести ASCII LF (это то, что n
представляет) в n
on output, например, так:
#include <stdio.h>
#include <string.h>
void fprintWithEscapes(FILE *file, const char *str)
{
const char *cr;
while ((cr = strchr(str, 'n'))) {
fprintf(file, "%.*s\n", (int)(cr - str), str);
str = cr 1;
}
if (*str) fprintf(file, "%s", str);
}
int main() {
fprintWithEscapes(stdout, "Hello, world!nA lot is going on.n");
fprintWithEscapes(stdout, "nAnd a bit more...");
fprintf(stdout, "n");
}
Вывод:
Hello, world!nA lot is going on.nnAnd a bit more...
Комментарии:
1. Извините! На самом деле это была моя вина за то, что я сделал вопрос немного не связанным с тем, что я действительно искал. Огромное спасибо! Я думал, что для получения каждой строки файла мне нужно будет получить весь файл в виде строки и разделить его на разрывы строк, думаю, нет. Спасибо, спасибо!
2. Вы действительно хотите это прочитать. Я имею в виду, что на самом деле прочитал все это целиком. Как только вы это сделаете, вы будете знать все функции ввода-вывода, предоставляемые стандартным языком C.