有没有办法只打印部分字符串?
例如,如果我有
char *str = "hello there";
有没有办法只打印"hello"
,请记住我要打印的子字符串是可变长度,而不是总是5个字符?
我知道我可以使用for
循环和putchar
或者我可以复制数组然后添加一个空终止符,但我想知道是否有更优雅的方式?
答案 0 :(得分:30)
试试这个:
int length = 5;
printf("%*.*s", length, length, "hello there");
答案 1 :(得分:16)
这也可以:
fwrite(str, 1, len, stdout);
它不会有解析格式说明符的开销。显然,要调整子字符串的开头,只需将索引添加到指针即可。
答案 2 :(得分:1)
您可以使用strncpy
复制要打印的字符串部分,但是您必须注意添加空终结符,因为如果它strncpy
将不会这样做在源字符串中没有遇到一个。正如Jerry Coffin所指出的,更好的解决方案是使用适当的*printf
函数来写出或复制你想要的子字符串。
尽管strncpy
对于不习惯的人来说可能是危险的,但与printf
/ sprintf
/ {{1}相比,它在执行时间方面会更快样式解决方案,因为没有处理格式化字符串的开销。我的建议是尽可能避免fprintf
,但为了以防万一,最好知道。
strncpy
答案 3 :(得分:0)
printf 和朋友们在使用部分字符串完成所有工作时效果很好,但是对于更通用的解决方案:
char *s2 = s + offset;
char c = s2[length]; // Temporarily save character...
s2[length] = '\0'; // ...that will be replaced by a NULL
f(s2); // Now do whatever you want with the temporarily truncated string
s2[length] = c; // Finally, restore the character that we had saved