文字列の一部のみを印刷する方法はありますか?
たとえば、私が持っている場合
char *str = "hello there";
印刷したい部分文字列が可変長であり、必ずしも5文字であるとは限らないことを念頭に置いて、"hello"
だけを印刷する方法はありますか?
for
ループとputchar
を使用できること、または配列をコピーしてヌルターミネータを追加できることは知っていますが、もっとエレガントな方法があるかどうか疑問に思っていますか?
これを試して:
int length = 5;
printf("%*.*s", length, length, "hello there");
これも機能します:
fwrite(str, 1, len, stdout);
フォーマット指定子を解析するオーバーヘッドはありません。明らかに、部分文字列の先頭を調整するには、ポインタにインデックスを追加するだけです。
strncpy
を使用して、印刷する文字列の部分を複製できますが、strncpy
が勝ったため、nullターミネータを追加するように注意する必要があります。ソース文字列に含まれていない場合は、これを行わないでください。 Jerry Coffinが指摘したように、より良い解決策は、適切な*printf
関数を使用して、必要な部分文字列を書き出すかコピーすることです。
strncpy
は、慣れていない人にとっては危険な場合がありますが、実行時間の点では、printf
/sprintf
/fprintf
スタイルのソリューション。フォーマット文字列を処理するオーバーヘッドがないためです。私の提案は、可能であればstrncpy
を避けることですが、念のために知っておくとよいでしょう。
size_t len = 5;
char sub[6];
sub[5] = 0;
strncpy(sub, str + 5, len); // char[] to copy to, char[] to copy from(plus offset
// to first character desired), length you want to copy
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