2016-08-31 1 views
0

は、次のコードのバージョン読みやすく、より短く、より良いあります動作しません:C++のchar [100] = "hello" を

char ar[100]; 

int main() { 
    //ar = "hello"; doesn't compile 
    ar[0] = 'h'; 
    ar[1] = 'e'; 
    ar[2] = 'l'; 
    ar[3] = 'l'; 
    ar[4] = 'o'; 
    ar[5] = '\x00'; 
    return 0; 
} 

注:arのタイプはchar[100]にする必要があります。 「本当の」プログラムは、次のとおりです。

#include <string> 
#include <cstdarg> 

#define TO_STRING_BUF_SIZE 100 

char toStringBuf[TO_STRING_BUF_SIZE]; 

std::string toCptr_(const char * format, ...) { 
    va_list argzeiger; 
    va_start(argzeiger, format); 
    int16_t ret = vsnprintf(toStringBuf, TO_STRING_BUF_SIZE, format, argzeiger); 
    if(ret >= TO_STRING_BUF_SIZE - 1) { 
    //toStringBuf = "buffer too small"; 
    } else if(ret < 0) { 
    //toStringBuf = "encoding error"; 
    } 
    va_end(argzeiger); 
    std::string returning(toStringBuf); 
    return returning; 
} 
+4

だから、問題は何ですか?ダミーコードまたは実際のコード?実際のコードにどこに問題があるのか​​? – NathanOliver

+0

'ar =" hello "'は構文エラーです。 'strcpy'を試してください –

+3

" arの型はchar [100]でなければなりません "あなたの教授またはTAがそうしている場合にのみ、それ以外の場合はベア・キャラクタ配列を使用する理由はありません。 –

答えて

-1

使用strncpy()、例えば:それはC/C++の中で最も古典的によく知られている危険な機能の一つであるとして

strncpy(toStringBuf, str_buf, TO_STRING_BUF_SIZE); 
toStringBuf[TO_STRING_BUF_SIZE-1] = 0; 

は、strcpy()を使用しないでください。バッファの末尾を超えて書き込みを行うことができ、バッファオーバーフローエラーが発生します。特定の例では問題はありませんが、一般的には避けてください。

+2

これは悪いアドバイスです。とりわけ[ここ](http://blog.liw.fi/posts/strncpy/)を参照してください。 'strncpy'関数は、Cスタイルの文字列ではなく、他の構造体内の固定長構造体を対象としていました。 –

+0

私は、記事が暗示しているようにCの文字列が駄目であることに同意しますが、strncpyはstrcpyより優れています。それは、エアバッグだけが安全であるため、シートベルトを使用すべきではないと言っているようなものです。シートベルトはまだシートベルトより優れています。 – Julius

+1

ありがとうございます。しかし、len(str1)の代わりにstrncpy(str2、str1、str2bufsize)にするべきではありませんか? 私の例では:strncpy(toStringBuf、 "buffer too small"、TO_STRING_BUF_SIZE); – Kryptomatrix

6

はCスタイルの文字列をコピーするstrcpy機能を使用してください。

strcpy(ar, "hello"); 
0

他の人は、strcpy()/strncpy()を使用して、文字列をchar[]バッファにコピーすることができます。

ただし、この例では実際には必要ありません。あなたの関数はstd::stringを返すので、実際にはchar[]は全く必要ありません。これは、短いメッセージのメモリ、長いメッセージの制限、およびスレッドが安全でない状態の浪費です(グローバルバッファの代わりにローカルバッファを使用しない限り)。代わりにこれを試してみてください:

#include <string> 
#include <cstdarg> 

std::string toCptr_(const char * format, ...) 
{ 
    std::string str; 

    va_list argzeiger; 
    va_start(argzeiger, format); 

    int ret = vsnprintf(NULL, 0, format, argzeiger); 
    if (ret < 0) { 
     str = "encoding error"; 
    } 
    else { 
     str.resize(ret+1); 
     vsnprintf(&str[0], str.size(), format, argzeiger); 
     str.resize(ret); 
    } 

    va_end(argzeiger); 

    return str; 
} 

か、非常に少なくとも、

#include <string> 
#include <cstdarg> 

#define TO_STRING_BUF_SIZE 100 

std::string toCptr_(const char * format, ...) 
{ 
    char toStringBuf[TO_STRING_BUF_SIZE]; 
    std::string str; 

    va_list argzeiger; 
    va_start(argzeiger, format); 

    int ret = vsnprintf(toStringBuf, TO_STRING_BUF_SIZE, format, argzeiger); 
    if (ret < 0) { 
     str = "encoding error"; 
    } 
    else if (ret < TO_STRING_BUF_SIZE) { 
     str.assign(toStringBuf, ret); 
    } 
    else { 
     str.resize(ret+1); 
     vsnprintf(&str[0], str.size(), format, argzeiger); 
     str.resize(ret); 
    } 

    va_end(argzeiger); 

    return str; 
}