15

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

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

char *str = "hello there";

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

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

4

4 に答える 4

35

これを試して:

int length = 5;
printf("%*.*s", length, length, "hello there");
于 2011-01-30T04:55:42.847 に答える
21

これも機能します:

fwrite(str, 1, len, stdout);

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

于 2011-01-30T04:58:47.560 に答える
1

印刷する文字列の部分を複製するために使用できますが、ソース文字列でターミネータが検出されない場合はstrncpy、ヌルターミネータを追加しないように注意する必要があります。strncpyJerry Coffinが指摘したように、より良い解決策は、適切な*printf関数を使用して、必要な部分文字列を書き出すかコピーすることです。

strncpy慣れていない人にとっては危険ですが、フォーマット文字列を処理するオーバーヘッドがないため、//スタイルのソリューションと比較して実行時間の点で高速になる可能性がありますprintf。できれば避けることをお勧めしますが、念のために知っておくことをお勧めします。sprintffprintfstrncpy

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
于 2011-01-30T04:59:14.983 に答える
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
于 2011-01-30T05:02:04.797 に答える