2017-02-28 137 views
1

介紹爲什麼string.empty()在字符串包含值時計算爲true?

我正在使用具有用於電子表格中的數據進行排序對話框的MFC應用程序。該對話框包含多個控件,包括編輯框。當用戶點擊確定按鈕時,對話框應該檢索他們的偏好並關閉。

問題

當正從對話框中的信息,包含的信息串總是註冊爲空。我定在了琴絃位於該位置的斷點,和價值觀似乎可以找到很好,但是當我調用任何函數來確定字符串的大小,它顯示爲0。

代碼

std::string min; 
std::string max; 
MinEdit.GetWindowText(&min[0], 20); 
MinVal = atof(min.c_str()); 

MaxEdit.GetWindowText(&max[0], 20); 
MaxVal = atof(max.c_str()); 

if (min.empty()) 
{ 
    AfxMessageBox(_T("Please Enter A Minimum Value")); 
    return; 
} 

if (max.empty()) 
{ 
    AfxMessageBox(_T("Please Enter A Maximum Value")); 
    return; 
} 

問題

爲什麼這些字符串總是註冊爲空?我檢查了它們的長度,返回爲零,但當我檢查MinVal和MaxVal時,它們的值已輸入到編輯框中。當這些字符串顯示爲空時,它們如何能夠用值來初始化其他變量?

+0

在MFC中最好使用'CString'。 'CWnd :: GetWindowText'有一個需要'CString&'的重載。 –

回答

5

這是錯誤。

std::string min; 
MinEdit.GetWindowText(&min[0], 20); 

該字符串沒有長度,並且您要求GetWindowText寫入該緩衝區。這是一個超限並導致未定義的行爲。

相反,分配字符串中的一些空間,然後後來調整它的大小:

std::string min; 
min.resize(20); 
min.resize(MinEdit.GetWindowText(&min[0], min.size())); 
2

你不能傳遞到std::string需要的字符數組的功能,而不先設置緩衝區的大小,然後調整串通話結束後。

min.resize(20); 
MinEdit.GetWindowText(&min[0], 20); 
min.resize(strlen(&min[0])); 
2

這是你的錯誤:

MinEdit.GetWindowText(&min[0], 20); 

字符串仍然是空的,並且語句寫入隨機,未分配的內存。如果你需要編寫成C++ std::string從一個C API,您首先需要手動調整其大小:

min.resize(static_cast<size_t>(MinEdit.GetWindowTextLength())); 
MinEdit.GetWindowText(&min[0], min.size()); 

或者,採取RAII成語的優勢:

std::string min(MinEdit.GetWindowText(), 
       static_cast<size_t>(MinEdit.GetWindowTextLength())); 

順便說一句,你真的想在Windows API(或MFC)中使用std::wstring。它映射到整個Windows使用的本地字符編碼。

相關問題