2011-01-23 22 views
8

これは本当にばかげた質問ですが、私はどこでも答えを見つけることができないようです!文字配列の一部を取得

char配列からcharのグループを取得できますか?出力

char arry[20] = "hello world!"; 
char part[10] = arry[0-4]; 
printf(part); 

:いくつかの擬似コードをスローダウンするので

hello 

、私がループし、それらがchar-により-charを取得または変換せずに、このような配列から文字のセグメントを取得することができます私はsubstr()を使用することができますか?

答えて

15

要するに、 Cスタイルの "文字列"は単にそのように動作しません。手動ループ、つまりstrncpy()を使用するか、またはC++ std::string機能を使用して行う必要があります。あなたがC++であることを考えると、C++の文字列ですべてを行うこともできます。

余談

偶然にも、あなたの特定の応用例のために、あなたは単にprintf()が提供する機能を経由して、これを達成することができます

printf("%.5s\n", arry); 
+0

大丈夫です。まあ、私は文字列に変換することができます、私はちょうどもっと...エレガントなソリューションがあるかどうか疑問に思っていた。 と私は後で使用するchar配列の一部をトリミングするので、printfの能力を使用するだけでは解決されません。とにかくそのおかげで、私はそれについて知らなかったし、それは便利になるかもしれない! – Curlystraw

+0

@Curlystraw:@ Moo-Juiceの答えはC++の文字列を使用しています。 –

14

あなたはmemcpy(またはstrncpy)を使用することができます部分文字列を取得する:

memcpy(part, arry + 5 /* Offset */, 3 /* Length */); 
part[3] = 0; /* Add terminator */ 

あなたのコードの側面では、strに信頼できない入力が含まれている場合、printf(str)を実行するとフォーマット文字列の脆弱性が発生することに注意してください。

+0

+1 'printf'脆弱性です。 –

4

Oliによると、C++ std::stringの機能を使用する必要があります。あなたの例:

std::string hello("Hello World!"); 
std::string part(hello.substr(0, 5)); // note it's <start>, <length>, so not '0-4' 

std::cout << part; 
+6

これは 'std :: string part(hello、0、5);'となる可能性があります... –

0

まあ、あなたは2つの明らかなアプローチについて言及しています。私が考えることができるのは、文字配列を処理する独自の部分文字列型を定義することだけです。

struct SubArray 
{ 
    SubArray(const char* a, unsigned s, unsigned e) 
     :arrayOwnedElseWhere_(a), 
     start_(s), 
     end_(e) 
    {} 
    const char* arrayOwnedElseWhere_; 
    unsigned start_; 
    unsigned end_; 
    void print() 
    { 
     printf_s("%.*s\n", end_ - start_ + 1, arrayOwnedElseWhere_ + start_); 
    } 
}; 
関連する問題