【问题标题】:Custom text wrap in CC中的自定义文本换行
【发布时间】:2018-12-11 19:53:20
【问题描述】:

我正在尝试创建一个函数,该函数接受字符串和一个表示要创建的每条线的宽度的数字。

它接受输入的方式如下: WrapText(string,20);

这个函数应该做的是在每一行放置字符串的最大“宽度”字符(在本例中为 20 个)。

换行前:

Lorem ipsum dolor sit amet,consectetuer adipiscing elit。 Curabitur vitae diam non enim vestibulum interdum。

包装后:

Lorem ipsum dolor

坐下,

连接器

肥胖精英。

Curabitur vitae diam

非敌人前庭

中间体。


一行中最多 20 个字符,并且该行必须适合整个单词,而不是中间切开。

有人可以帮我解决这个问题吗?我尝试了一些东西,但我就是做错了。

我尝试过的东西:

int x=0,line=0,total=0;
while(arr[x]!='\0'){
    if(arr[x]!=' '){
        line++;
    }else{
        if(total+line>=width){
            arr[x]='\n';
        }else{
            line++;
            total+=line;
        }
        line=0;
    }
    x++;
}

【问题讨论】:

  • 我尝试了一些东西 - 向我们展示这些东西并解释它为什么不起作用。
  • 我可以推荐 K&R 的书。慢慢来,如果你真的想学 C,那是值得的。这个练习实际上是书中的练习之一。它会教你任何你需要的东西。
  • @EugeneSh。我添加了我制作的代码,它适用于第一行,但它只是中断并在每一行上放置一个单词。
  • 是时候学习如何调试了;这是程序员将要学习的最重要的一项技能。 ericlippert.com/2014/03/05/how-to-debug-small-programs
  • 您没有重置您的计数器。因此,创建第一行后,您需要将totalline 重置为零。但是,还要注意这一更改将打印出超过 20 个字符的行。

标签: c


【解决方案1】:

在输出任何内容之前,您需要提前扫描、阅读每个单词并计算其长度。您可以通过将单词复制到临时缓冲区来执行此操作,也可以在扫描时使用指针来执行此操作。

使用缓冲区很简单,但是由于您不知道要分配多大的缓冲区,因此具有固有的局限性。

指针版本可以作为具有两种状态的简单状态机来完成,BETWEEN_WORDS 和 IN_WORD。所有有趣的事情都只发生在状态转换时;扫描单词或空格只是预读。

伪代码:

initial state = BETWEEN_WORDS
start_of_word_ptr = null

for each character,
    if whitespace, then
        if the current state is IN_WORD, then
            the new state is BETWEEN_WORDS
            word_length = current_pos - start_of_word_pos
            if current_line_length + word_length + 1 > max_line_length, then
                /* start a new line */
                print linefeed
                current_line_length = 0
            else
                /* output space */
                print a space between words
                current_line_length++
    else if not whitespace, then
        if the current state is BETWEEN_WORDS, then
            the new state is IN_WORD
            start_of_word_ptr = current_ptr

        /* output word */
        print the characters from start_of_word_pos to current_pos
        current_line_length += word_length

这是一个基本算法,可以为字符串输入执行您想要的操作。根据口味定制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多