.

wkrntlfjdynn의 이미지
wkrntlfjdynn의 이미지

아 코드에 harry.txt 랑 aligned.txt를 각각 input.txt output.txt 라 생각하시면 됩니당

shint의 이미지

- 일단. 1바이트씩. 모든 문자를 80자로 만들었습니다.

- 다음 라인으로 가는 경우. 문자열이 있을때. 공백으로 채워야 하는거 같네요.
현재 라인에 마지막 문자와
다음 라인에 첫번째에 문자가 있으면.
현재 라인에 마지막을 공백으로 채우는것을 추가하면 될것 같습니다. ㅇ_ㅇ;;

- 다음 줄의 첫 문자가 '\t' 이나 ' ' 일경우도. 예외 처리가 필요해보입니다.

- Qt SDK 에 문자 정렬하는 예제가 있습니다. (자간 장평 포함...)
https://www.youtube.com/watch?v=0A3mk3gU6j0

https://ide-run.goorm.io

#pragma warning (disable:4996)
#include <stdio.h>
#include <string.h>
#define MAX 100
char buffer[MAX];
char txt[80];
char *token1, *token2, *token3;
int main()
{
	FILE*in_fp = fopen("input_1.txt", "r");
	FILE*out_fp = fopen("aligned.txt", "w");
 
	int cnt = 0;
	int max = 0;
	while (!feof(in_fp))
	{
		fread(buffer, 1, 1, in_fp);
 
		if(buffer[0] == '\n')
		{
			continue;
		}
 
		//
		if(buffer[0] == '\t' || buffer[0] == ' ')
		{
			if(cnt == 0)
			{
				fwrite(buffer, 1, 1, out_fp);
				max++;
			}
			cnt++;
		}
		else
		{
			cnt = 0;
		}
		txt[0] = buffer[0];
		if(cnt == 0)
		{
			fwrite(buffer, 1, 1, out_fp);
			max++;
		}
		if(max >= 79)
		{
			max = 0;
			buffer[0] = '\n';
			fwrite(buffer, 1, 1, out_fp);
		}
	}
 
	fclose(in_fp);
	fclose(out_fp);
	return 0;
}
 
#if 0
chapter one the riddle house the villagers of little hangleron still called it 
riddle it many years since the riddle family had lived it stood onsome of its w
indows tiles missing from its and ivy overonce a and easily the largest and gra
ndest building for milesthe riddle house was now and the little hagletons all a
greed that the old house was halfstrange and horrible had happened something th
at the older of liked to discuss when topics for gossip were the story soand ha
d been embroidered in so many that nobody was quite thewas every version of the
 started in the same fifty years atdaybreak on a fine morning when the riddle h
ouse had still been a maid had entered the drawing room to find all threethe ma
#endif

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

wkrntlfjdynn의 이미지

좌우로 80자로 딱 정렬이 되야하고, 단어가 잘리면 안되는게 조건입니다 그리고 입력파일에 공백 라인이 있으면 그것도 그대로 출력해야하는데 생각보다 쉽지 않군요 ㅜ

shint의 이미지

그럼. 문자가 아니라... 단어'인지도 알아야 하는거네요. ㅇ_ㅇ??

종이접기 아닌 경우
종이 O
접기 O

....종이
접기

종이접기 인 경우
종이 X
접기 X

....종이
접기

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

shint의 이미지

.

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

shint의 이미지

.

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

wkrntlfjdynn의 이미지

.

raymundo의 이미지

출력 예시 파일이 좀 이상해보입니다.

when the riddle house had still been a maid had entered the drawing room to find
all  three  the maid had run screaming down the hill into the village 
 
there  with  their  eyes  wide cold as still in their dinner the police were and 
the  whole of little hangleton had with curiosity and nobody wasted their breath

입력 파일에서 두 칸 이상 띄어져 있는 곳이 출력에는 한 칸만 되어 있는 것으로 보아 입력에 있는 단어 사이 공백을 그대로 유지하는 건 아닌 거겠죠? 기본적으로 한 칸씩 띄고, 80칸을 맞추기 위해 필요하다면 추가로 더 띄우는 것으로 보입니다.

그런데 문제에 각 단락 마지막 줄은 그냥 왼쪽 정렬하라고 되어 있는데 출력 예시의 첫 단락 마지막 줄에 보면 all과 three 사이가 두 칸 띄워져 있고요.

두번째 단락의 경우 두 칸씩 띄어진 곳을 다 한 칸만 띄우면 그 다음 줄 the 까지 첫 줄에 쓸 수 있습니다.

그 다음, 본문에 올려주신 코드를 가지고 왜 잘못된 출력이 나오는지 분석하자니 주석도 전혀 없는 상태라 너무 시간이 걸리고... 디버거를 쓰시든가, 하다못해 곳곳에 printf라도 집어 넣어서, 현재 무슨 단어를 읽었고 어느 if 블록에 진입해서 어떤 처리를 하고 있는지, 그게 작성하신 분 의도에 맞는 동작인지 검토해보시는 걸 추천드리고요.

근데 저라면 지금처럼 txt 배열에 한 줄 입력을 조립하다가 공백을 하나 추가할 때마다 그 뒤의 문자들을 전부 한 칸씩 뒤로 미루는 for 루프를 쓰는 것보다... 읽어들인 단어들을 리스트로 가지고 있다가 출력할 때 단어 사이에 공백을 추가로 출력하는 게 편하지 싶습니다.

단어 리스트 초기화
 
while ( 한 줄 읽고 )
  if ( 빈 줄이면 )
    현재까지 리스트에 담긴 단어들을 왼쪽 정렬로 출력
    리스트 초기화
  else
    while ( 한 단어씩 뽑아내어 )
 
      if 리스트의 단어들과 이번 단어를 합쳐 한 칸씩 띄웠을 때의 길이 > 80
        리스트의 단어들을 80칸에 맞춰 좌우 정렬로 출력
        리스트 초기화
 
      이번 단어를 리스트에 추가
 
// 입력 끝
현재까지 리스트에 담긴 단어들을 왼쪽 정렬로 출력
끝
 
 
void 리스트에 담긴 단어들을 출력하는 함수
  if (왼쪽 정렬)
    리스트의 단어들을 단어 하나 출력하고 공백 한 칸 출력하고... 반복
  else // 좌우 정렬
    80칸을 맞추기 위해 추가해야 할 공백 갯수 계산(예: 7)
    그 공백을 집어넣을 수 있는 칸의 수 = 단어 수 - 1 (예: 5)
    7개의 공백을 5칸에 고르게 분배하려면, 처음 2칸은 공백 2개, 나머지 3칸은 공백 1개인 걸 계산
    리스트의 단어들을 하나씩 출력하면서 저 계산에 맞춰 각 단어 사이에 공백 추가 출력

위와 같이 작성하면 출력은 다음처럼 나옵니다.

chapter  one  the riddle house the villagers of little hangleron still called it
riddle  it  many years since the riddle family had lived it stood on some of its
windows  tiles  missing  from its and ivy over once a and easily the largest and
grandest  building  for  miles the riddle house was now and the little hagletons
all  agreed  that  the  old  house  was  half  strange and horrible had happened
something  that  the  older  of liked to discuss when topics for gossip were the
story so and had been embroidered in so many that nobody was quite the was every
version  of  the  started  in the same fifty years at daybreak on a fine morning
when the riddle house had still been a maid had entered the drawing room to find
all three the maid had run screaming down the hill into the village
 
there with their eyes wide cold as still in their dinner the police were and the
whole  of  little  hangleton  had  with curiosity and nobody wasted their breath
pretending  to feel about the for they had been most elderly and riddle had been
and  and  their  had  if all the villagers cared about was the identity of their
murderer  three  did  not all drop dead of natural causes on the same the hanged
the village did a roaring trade that the whole to have turned out to discuss the
they  were  rewarded  for  their  cook  arrived  dramatically in their midst and
announced  to  a  man called frank bryce had just been cried several frank bryce
was  the  he  lived  alone in a cottage on the of the riddle frank had come back
from  the  war  with a very crowds and loud and had been working for the riddles
ever  there  was  a rush to buy the cook drinks and hear more thought he was she
told  the  eagerly  listening after her sure if offered him a cuppa offered it a
hundred  never wanted to he said a woman at the had a hard he likes the quiet no
reason  to else had a key to the back barked the been a spare key hanging in the
cottage  far  back  as i can nobody forced the no broken all frank had to do was
creep up to the big house
...

좋은 하루 되세요!

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.