2013-04-06 72 views
0

我正在尝试换行使用行长度,并且一次打印一行(行长度),而不是将整行打印为大块。我认为在每行长度添加'\ n'字符可以完成这项工作并编写下面的代码。实现换行的不同方法

void wrap(char *tok, int len) 
{ 
    int i, h; 
    char *ss = tok; 
    for (h = linelen; h < (len + 1); (h + linelen)) 
    { 
     ss[h] = '\n'; 
     printf("%d\n", h); 
     h += linelen; 
    } 
    char *token = strtok(ss, "\n"); 
    while (token) 
    { 
     printf("%s\n", token); 
     token = strtok(NULL, "\n"); 
    } 
} 

但是这段代码似乎没有工作。我可以采用哪些其他方法来实现换行?

+0

什么是'linelen'?无论如何,包装文本比看起来更难。你可以看一个如何[FMT](http://code.metager.de/source/xref/DragonFly-BSD/usr.bin/fmt/fmt.c)做的。 – jxh 2013-04-06 16:05:45

+0

窗口可容纳的列数。 – 2013-04-06 16:09:30

+0

也许'H + linelen' - >'H + = linelen','SS并[h] =“\ n''破碎原始字符。 – BLUEPIXY 2013-04-06 16:09:52

回答

1

你并不需要更改原始的字符串,你只需要在必要时打印出额外的新行:

void wrap(char *str, int len, int linelen) { 
    int i; 
    for (i = 0; i < len; ++i) { 
     printf("%c", str[i]); 
     if (i > 0 && i % linelen == 0) { 
      printf("\n"); 
     } 
    } 
} 

如果您的原始字符串可能有它的换行符,你可以保留当前的轨迹线的长度,使下一行是正确的包裹:

void wrap(char *str, int len, int linelen) { 
    int i, currlen; 
    for (i = 0, currlen = 0; i < len; ++i, ++currlen) { 
     printf("%c", str[i]); 
     if (str[i] == '\n') { 
      currlen = 0; 
     } 
     if (currlen > 0 && currlen % linelen == 0) { 
      printf("\n"); 
     } 
    } 
} 
1

您的程序似乎想要将tok分割为多个linelen字节,但您似乎并不在意要替换哪个字符来实现此目的。这会使wrap例程删除原始输入中的信息。然后您打电话strtok一次打印一个标记,但损坏已经完成。

相反,我相信你应该调整你的代码,以便strtok是用来寻找一个道理,你是否计算打印当前令牌将让你在你的linelen与否。如果可以,您将打印一个换行符,打印该令牌并计算当前的运行行长度,只是您刚刚打印的令牌的长度。您在同一行上打印的每个标记都会增加运行行的长度。

void wrap(char *tok, int linelen) 
{ 
    int len = 0; 
    char *ss = tok; 
    char *token = strtok(ss, " \t\n"); 
    while (token) { 
    int tokenlen = strlen(token); 
    if (len && (len + tokenlen + 1 > linelen)) { 
     puts(""); 
     len = 0; 
    } 
    if (tokenlen) { 
     printf("%s%s", len ? " " : "", token); 
     len += 1 + tokenlen; 
    } 
    token = strtok(0, " \t\n"); 
    } 
    if (len) puts(""); 
} 

您的原始实施并未考虑如何处理制表符。如果将所有线性空白字符添加到strtok分隔符,则所有选项卡将被视为令牌分隔符,并且在输入被打包时将被删除。正确处理选项卡会使运行行长度计算复杂化,因为制表符会导致行长跳到下一个制表位。