是否有高效( - 就性能而言)打印某些任意字符串的方式,但只有在其中的第一个新行字符(不包括新行字符)之后?
示例:
char *string = "Hello\nWorld\n";
printf(foo(string + 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
的速度很快,puts
比printf
快,但是很可能比前面提到的所有三个操作都慢得多。
答案 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';