2014-03-26 54 views
-2

我不能相信我不能得到這個權利!有人請幫忙! 這是說沒有被初始化正在使用字(是必需的?):簡單的字符串處理sprintf

int main(int argc, char* argv[]) 
{ 
    char* word; 
    sprintf(word,"%d",12); 
    std::cout << word; 

    return 0; 
} 

如果我是這樣做,它給調試斷言失敗!:

int main(int argc, char* argv[]) 
{ 
    char* word = NULL; // char* word = nullptr; 
    sprintf(word,"%d",12); 
    std::cout << word; 

    return 0; 
} 

我已經包含了標準輸入輸出.h標題。我在這方面摸不着頭腦。

回答

2

您需要使用分配的內存對其進行初始化。

char word[20]; 

char* word = new char[20]; 

它初始化爲NULL會使其崩潰的函數試圖在這個地址寫入。不初始化它也將是未定義的行爲,因爲地址將是垃圾。

+0

+1。應該添加'sprintf'被認爲是不安全的(http://stackoverflow.com/questions/3662899/understanding-the-dangers-of-sprintf) – Axel

1

這兩個代碼片段都是未定義的行爲

在第一,指針word未初始化,所以它的價值是不確定的(並且將似乎是隨機的),因此,使用寫入數據時,你不知道哪裏它會被寫入。

第二個將始終寫入地址爲零,這也是未定義的行爲。


對此的解決方案是要記住,你正在使用C++,其中有std::string

std::string word; 
word = "12"; 

或者,如果你有因爲要使用一個整數的數量,再看看在std::ostringstream

int value = 12; 

// ... 

std::ostringstream os; 
os << value; 

std::string word = os.str(); 
0

您聲明word作爲指針:什麼? 如果你需要一個,你仍然要使用sprintf,你必須聲明它的長度:

char word[20]; // twenty bytes including string terminator \0 

這個固定長度的語法很容易出現錯誤和過時的今天:請參閱@Joachim Pileborg回答更好地使用字符串C++