web-dev-qa-db-ja.com

文字列の一部をCで出力する

文字列の一部のみを印刷する方法はありますか?

たとえば、私が持っている場合

char *str = "hello there";

印刷したい部分文字列が可変長であり、必ずしも5文字であるとは限らないことを念頭に置いて、"hello"だけを印刷する方法はありますか?

forループとputcharを使用できること、または配列をコピーしてヌルターミネータを追加できることは知っていますが、もっとエレガントな方法があるかどうか疑問に思っていますか?

13
Mark

これを試して:

int length = 5;
printf("%*.*s", length, length, "hello there");
32
Jerry Coffin

これも機能します:

fwrite(str, 1, len, stdout);

フォーマット指定子を解析するオーバーヘッドはありません。明らかに、部分文字列の先頭を調整するには、ポインタにインデックスを追加するだけです。

17
Mehrdad Afshari

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
1

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
0
farfromhome