2012-01-07 11 views
2

char[]をcとすると、その配列から出力される出力の長さをprintfに指定したいのですが、どのようにすれば便利でしょうか?printfに出力するchar []の長さを指定する方法

例えば、I 8を位置決めする(0からインデックス付け)位置3の部分を印刷したい:

printf("%s", char_array+3..char_array+8) 

I []は、所望の長さの一時的な文字を作ることができるが、それは非常にありません便利。それとも私が

char* substring(const char* str, size_t begin, size_t len) { 
    if (str == 0 || strlen(str) == 0 || strlen(str) < begin || strlen(str) < (begin + len)) 
     return 0; 
    return strndup(str + begin, len); 
} 

SUBSTRING関数を書くことができしかし、私は

printf("%s", substring(s, 3, 5)); 

呼び出す場合、私は、メモリリークが発生します怖いです。

これを行う最善の方法についてどう思いますか?

+3

はい、メモリリークが発生します。 – Mysticial

+0

'str [n] dup'を使用することをお勧めします。なぜなら、' malloc'をどこでも見ることなくメモリリークを作り出すという狡猾な性質を持っているからです。 –

+0

@Seth 'malloc'と' strcpy'を好むでしょうか?より良いストリングをサポートする言語を選択する方が良いでしょう。 –

答えて

7
#include <stdio.h> 

int printmid(const char *data, size_t start, int len) { 
    return printf("%.*s", len, data + start); 
} 

int main(void) { 
    char data[] = "Hello, World!"; 
    printmid(data, 3, 6); 
    puts(""); 
    return 0; 
} 

出力

lo, Wo
+0

あなたは魔法の数字を避けることができますか? –

+1

+1私はそれをすることができないことを完全に忘れていました。 –

+0

@ジョナサン:忍者が編集した後は大丈夫だと思います:) – pmg

1
int end = 8; 
int bgn = 3; 
int len = end - bgn + 1; 
printf("%*.*s", len, len, char_array + bgn); 

lenintなければならないことに注意してください(としない、例えば、二つのポインタ間の差 - それはptrdiff_t又はsize_t'S)。必要に応じて最初の長さを省略することもできます。どちらも指定できます。ソース文字列が指定された長さよりも短い場合は(つまり、文字列にヌルバイトがあることを意味します(char_array + endより前)明らかに、char_arrayの文字列が4バイトより短い場合、終端のヌルに続くものはおそらくゴミであり、GIGOが適用されます。文字列の長さが8バイト以上であることが確実でない場合は、出力を左揃えにすることをお勧めします。その場合は、最初に*の前にマイナス-を挿入します。書かれているように、短い文字列は右揃えになります。

関連する問題