由于换行而打印字符串

时间:2015-07-27 12:37:56

标签: c string performance pointers newline

是否有高效( - 就性能而言)打印某些任意字符串的方式,但只有在其中的第一个新行字符(不包括新行字符)之后?

示例:

char *string = "Hello\nWorld\n";

printf(foo(string + 6));

输出:

  

世界

6 个答案:

答案 0 :(得分:2)

如果您担心性能,这可能会有所帮助(未经测试的代码):

void MyPrint(const char *str)
{
  int len = strlen(str) + 1;
  char *temp = alloca(len);

  int i;
  for (i = 0; i < len; i++)
  {
    char ch = str[i];
    if (ch == '\n')
      break;
    temp[i] = ch;
  }

  temp[i] = 0;

  puts(temp);
}

strlen很快,alloca很快,将字符串复制到第一个\n的速度很快,putsprintf快,但是很可能比前面提到的所有三个操作都慢得多。

答案 1 :(得分:1)

.writingMode {
    writing-mode:tb-rl;
    -webkit-writing-mode:vertical-rl;
    writing-mode:vertical-rl;
    border: 5px green solid;
    word-break:break-word;
    overflow:hidden;
    width:100px;
}

这可以稍微概括一下(将size_t writetodelim(char const *in, int delim) { char *end = strchr(in, delim); if (!end) return 0; return fwrite(in, 1, end - in, stdout); } 传递给函数),但它已经足够灵活,可以终止任何选定分隔符的输出,包括FILE*

答案 2 :(得分:0)

警告:不使用没有格式说明符的printf来打印变量字符串(或从变量指针)。请改为使用puts"%s", string

C字符串由'\0'(NUL)终止,而不是换行符。因此,函数打印直到NUL终止符。 但是,您可以使用自己的putchar循环。如果是,则要测试任何性能损失。通常printf在库中做的大致相同,甚至可能更慢,因为它必须考虑更多的附加约束,所以你自己的循环可能会更快。

for ( char *sp = string + 6 ; *sp != '\0'; sp++ ) {
    if ( *sp == '\n' )  break;  // newline will not be printed
    putchar(*sp);
}

(如果您想要打印换行符,请将if - 行移至循环的末尾。)

另一种方法是限制要打印的字符串的长度,但这需要在调用printf之前找到下一个换行符。

答案 3 :(得分:0)

我不知道它是否足够快,但有一种方法可以构建一个包含源字符串的字符串,直到新行字符只涉及一个标准函数。

char *string = "Hello\nWorld\nI love C"; // Example of your string
static char newstr [256]; // String large enough to contain the result string, fulled with \0s or NULL-terimated

sscanf(string + 6, "%s", newstr); // sscanf will ignore whitespaces
sprintf(newstr); // printing the string

答案 4 :(得分:0)

我猜没有比简单地循环遍历字符串更有效的方法,直到找到第一个\n。正如Olaf提到的那样,C中的字符串以终止\0结尾,因此如果您想使用printf打印字符串,则需要确保它包含终止\0或yu can使用putchar按字符打印字符串。

如果你想提供一个函数来创建一个字符串,直到第一个找到的新行,你可以这样做:

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

#define MAX 256

void foo(const char* string, char *ret) 
{
  int len = (strlen(string) < MAX) ? (int) strlen(string) : MAX;
  int i = 0;
  for (i = 0; i < len - 1; i++) 
  {
    if (string[i] == '\n') break;
    ret[i] = string[i];
  }
  ret[i + 1] = '\0';
}


int main()
{
  const char* string = "Hello\nWorld\n";
  char ret[MAX];
  foo(string, ret);
  printf("%s\n", ret);
  foo(string+6, ret);
  printf("%s\n", ret);
}

这将打印

Hello
World

答案 5 :(得分:0)

另一种快速方式(如果新行字符真的不需要) 简单地:

*strchr(string, '\n') = '\0';