实现换行的不同方法

时间:2013-04-06 15:58:46

标签: c

我尝试使用行长度包装一条长行并一次打印一行(行长),而不是将整行打印为块。我想在每个行长度添加'\ 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");
    }
}

但是这段代码似乎没有用。我还有什么方法可以实现换行?

3 个答案:

答案 0 :(得分:2)

此帖子被盗:Is it possible to print out only a certain section of a C-string, without making a separate substring?

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

int main(void) {

    char *str = "helo world";
    int total_len = strlen(str);
    int single_len = 3;
    for (int i = 0; i < total_len; i += single_len) {
        /* print at most first three characters (safe) */
        printf("%.*s\n", single_len, str + i);
    }

    return 0;
}

答案 1 :(得分: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");
        }
    }
}

答案 2 :(得分: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分隔符,则所有选项卡将被视为标记分隔符,并在包装​​输入时将被删除。正确处理选项卡会使运行行长度计算变得复杂,因为制表符会导致行长度跳转到下一个制表位。

相关问题