2015-03-31 160 views
0

我使用sprintf()但是,我收到訪問衝突錯誤;sprintf無法正常工作 - 導致訪問衝突

僅當字符串的內容僅包含3個或更少的整數時纔會出現此錯誤。 (顯示在下面)

這是一種從txt文件中讀取整數並對它們進行排序的方法;

string getIntsFromFile() { 

ifstream myfile("/pathToFile/file.txt"); 
vector<int> values; 
int value = 0; 
string testString; 

while (!myfile.eof()) 
{ 
    myfile >> value; 

    if (myfile.eof()) break; 

    values.push_back(value); 
} 

sort(values.begin(), values.end(), greater<int>()); 

for (int i = 0; i < values.size(); i++) 
    testString = testString + to_string(values[i]) + "\n"; 
return testString; 
}  

然後我使用這個函數;

char myString[128];
sprintf(myString, "%s", getIntsFromFile());

這只是否有txt文件超過3個整數,但任何減少提示訪問衝突錯誤的作品。

txt文件中的整數由'\ n'分隔,所以每行只有一個整數。

+0

你應該提供實際的代碼,而不是你記得的。我懷疑'sprintf(myString,「%s」,getIntsFromFile());'會編譯。提供MCVE – Slava 2015-03-31 16:41:25

+1

'while(!myfile.eof())'是錯誤的。使用'while(myfile >> value)' – 2015-03-31 16:43:16

+4

'sprintf'與「%s」格式說明符需要'char *'參數。 'getIntsFromFile()'返回一個'std :: string'。試試'getIntsFromFile()。c_str()'。 – SleuthEye 2015-03-31 16:43:43

回答

4

sprintf"%s"格式說明符期望char*參數。另一方面,getIntsFromFile()返回std::string。在參數類型與預期類型不匹配的情況下,行爲是未定義的(在您的情況下,您可以將其視爲訪問衝突)。

爲了證實這一點,你可以嘗試

sprintf(myString, "%s", getIntsFromFile().c_str()); 

代替。

但請注意,隨着整數數量的增加以及字符串超出緩衝區分配的大小,這也可能失敗。

+0

這工作很好!非常感謝! 你能告訴我爲什麼當文件有3個以上的整數時,沒有'c_str()'而沒有使用'c_str()'而不是當它少了? – sbranturesh 2015-03-31 17:53:27

+1

這是_undefined behavior_的方法。如果沒有確切的輸入,精確編譯的指令以及執行時可能的確切內存內容,通常不可能精確地確定會發生什麼(包括正在工作的_appearance_)。 – SleuthEye 2015-03-31 18:17:12

+0

感謝您向我解釋!真的很感謝幫助! – sbranturesh 2015-03-31 18:19:20

2

可以在字符串上使用c_str()方法或使用std::copy()方法達到此目的。