2012-11-14 2 views
1

초급 여기에. C에서 랩 함수를 작성하고 있는데,이 함수는 전달하는 문자열의 모든 단어가 내가 정의한 선의 크기보다 작 으면 OK입니다. 예 : 20 자 이후에 줄 바꿈하고 21 자 단어를 전달하려는 경우 줄 바꿈하지 않습니다. 실제로 수행 할 작업을하이픈을 랩 함수에 넣습니다.

내가 (정의 라인 크기 이상) 긴 단어를 전달하면 줄의 끝에 하이픈을 추가하고 다음 줄에에 수행하는 것입니다. 랩 함수를 사용하여 많은 웹 사이트를 조사하고 발견했지만 그 중 아무 것도 하이픈을 삽입하는 방법을 보여주지 못 했으므로 나를 도와 줄 수 있습니까? 하이픈을 삽입하는 예를 보여 주거나 올바른 방향으로 나를 가리켜 주시겠습니까? 미리 감사드립니다.

내 포장 기능 :

int wordwrap(char **string, int linesize) 
{ 
    char *head = *string; 
    char *buffer = malloc(strlen(head) + 1); 
    int offset = linesize; 
    int lastspace = 0; 
    int pos = 0; 

    while(head[pos] != '\0') 
    { 
     if(head[pos] == ' ') 
     { 
      lastspace = pos; 
     } 
     buffer[pos] = head[pos]; 
     pos++; 

     if(pos == linesize) 
     { 
      if(lastspace != 0) 
      { 
       buffer[lastspace] = '\n'; 
       linesize = lastspace + offset; 
       lastspace = 0; 
      } 
      else 
      { 
       //insert hyphen here? 
      } 
     } 
    } 
    *string = buffer; 
    return; 
} 

내 주요 기능 :

#include <stdio.h> 
#include <string.h> 

int main(void) 
{ 
    char *text = strdup("Hello there, this is a really long string and I do not like it. So please wrap it at 20 characters and do not forget to insert hyphen when appropriate."); 

    wordwrap(&text, 20); 

    printf("\nThis is my modified string:\n'%s'\n", text); 
    return 0; 
} 
+0

입력 해 주셔서 감사합니다. 나는 네가 그 줄 끝에 가서 그 말을 어기면 안된다는 것을 이해한다. 나는 긴 단어를 어기는 법을 연구했지만, '하이픈'과 '돌아 오는'문자는 그 긴 단어의 두 문자를 대체합니다. 나는 realloc을 사용하는 것이 효과가있을 것이라고 생각하지만 매우 긴 문자열을 입력하면 매우 효율적이지는 않습니다. 당신이 생각할 수있는 다른 방법이 있습니까? 감사. –

답변

0

당신은 아마 메모리 블록을 malloc에 ​​필요하고 새로운 영역으로 문자열에서 복사합니다. 휴식을 추가 할 장소에 도달하면 간단하게 개행을 삽입하십시오. 메모리의 새로운 블록을 해제해야 할 필요가 있거나 메모리 누수가 발생하여 결국 메모리가 부족하다는 것을 기억하십시오. realloc과의 문제

+0

결과 문자열 길이의 좋은 초기 예상 값은'strlen (string) * 21/20 + 1'입니다. 즉 20 문자마다 하이픈 문자를 추가한다고 가정합니다. –

+0

안녕하세요 개미, 내가하신 말씀을 완벽하게 이해하고 있지만 코드로 번역 할 수는 없습니다. 예를 보여 주시겠습니까? 감사. –

+0

우선 C를 사용하지 않고 C++을 사용하고 있는지 먼저 확인할 수 있습니까? – Ant

0

좋은 해결책은 갭 버퍼이다. 당신은 할당

는 데이터의 앞에 원래 4KB의 차이를 말한다.

[____________string start here... ] 
[str____________ing start here... ] 
[string\n___________start here... ] <-- here I just decided to insert line break 

공백이나 문자를 삭제하면 간격이 넓어집니다. 하이픈과 줄 바꿈을 추가하면 간격이 줄어 듭니다. 어떤 경우에도 간격의 끝에서부터 간격의 시작까지 모든 문자를 한 번만 움직이는 것에 관심을 가져야합니다.

가능한 첫 번째 패스 워드 길이를 계산하기 위해 버퍼의 끝에서 격차를 삽입하고 여분의 공백이나 줄 바꿈을 삭제 뒤로 일을하고 나하는 것이다.

물론 언제든지 을 찾아서을보고 다음 단어가 너무 길면 계산할 수 있습니다.