2016-08-31 31 views
0

是否還有更好的,更短,更易於閱讀下面的代碼版本:C++的char [100] =「你好」不起作用

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(),如:

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

不要使用strcpy(),因爲它是在C/C++中最經典知名的不安全的功能之一。它可以寫入緩衝區的末尾,導致緩衝區溢出錯誤。在您的特定示例中不是問題,但通常應該避免它。

+2

這是個不好的建議。見[這裏](http://blog.liw.fi/posts/strncpy/)等地。 'strncpy'函數用於其他結構中的固定長度結構,而不適用於C風格的字符串。 –

+0

我同意C字符串很糟糕,但文章暗示,但strncpy仍然比只是strcpy更好。這就像說你不應該使用安全帶,因爲只有安全氣囊是安全的。安全帶仍然比沒有安全帶好。 – Julius

+1

謝謝,但不應該是strncpy(str2,str1,str2bufsize)而不是len(str1)? 在我的例子中:strncpy(toStringBuf,「buffer too small」,TO_STRING_BUF_SIZE); – Kryptomatrix

6

使用strcpy的功能來複制C風格的字符串。

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; 
}