2014-10-03 71 views
1

我的代碼編譯崩潰後,當達到正則表達式的一部分時:C++程序崩潰使用正則表達式

我想檢查是在收到的字串存在,或沒有任何數字。

#include <iostream> 
#include <regex> 
using namespace std; 

int main() 
{ 
    int in, count, rate; 
    char *w; 
    cin >> count; 

    for(in = 1; in < 5; in++) { 
     rate = 0; 
     cin >> w; 
     cout << "Case #"; 
     cout << in; 
     cout << ":"; 

     if (regex_match (std::string(w), regex("([0-9])"))) 
      ++rate; 
     cout << rate; 
     cout << endl; 
    } 
    return 0; 
} 
+2

那麼你在哪裏爲那個char *變量分配內存呢?在你弄清楚之後,別忘了釋放它...... – 2014-10-03 17:03:52

回答

7

您正在使用沒有分配內存的指針。這會使你的程序崩潰。剛剛宣佈它作爲一個字符串,並儘量避免裸指針:

std::string w; 
+0

謝謝你,之後改變了它的程序正常工作。 – 2014-10-03 17:16:22

+0

現在在[0-9]在正則表達式崩潰。當我改變它的程序工作正常 – 2014-10-03 17:20:51

3

爲了避免這種錯誤的功能,請啓用警告,即-Wall

main.cpp:6:18: warning: 'w' is used uninitialized in this function [-Wuninitialized] 
    cin >> w; 

使用w之前,需要爲它分配內存。通常,在C語言風格的代碼,既可以使用一個陣列,自動存儲:

char w[80]; // some arbitrary number guaranteed to be large enough to hold 
      // user input 

或動態存儲器:

char* w = new char[80]; 
// ... 
delete[] w; 

如另一個答案所述,它是更地道在C使用std::string ++因爲它爲你處理記憶。這也避免了你在代碼中創建所有那些不必要的臨時對象:

if (regex_match (std::string(w), regex("([0-9])"))) 
// ~~~~~~~~~~~~~~^