2011-11-28 68 views
3

時,我有這樣的:段錯誤獲取用戶輸入

// Get database access parameters 
    const char* db = "codes", *server = "localhost", *user = "root", *pass = "pass"; 

    // Connect to the sample database. 
    mysqlpp::Connection conn(false); 
    if (conn.connect(db, server, user, pass)) { 

     for (int i=0; i<10; ++i) 
     { 
      int d, count; 
      cout << "Введите D\n"; 
      cin >> d; 
      cout << "Введите количество записей при D=" << d << endl; 
      cin >> count; 
      for (int a=0; a<count; ++a) 
      { 
       char * name; 
       int r,n1,n2; 
       cout << "Введите R\n"; 
       cin >> r; 
       cout <<"Введите n1 и n2\n"; 
       cin >> n1 >> n2; 
       cout <<"Введите название\n"; 
       cin >> name; 
       mysqlpp::Query query = conn.query(); 
       for (int j=n2-n1+1; j<n2; ++j) 
       { 
        int k =pow(2,(j+r)); 
        query << "insert into code (n,k,d, name) values (" << j << "," << k << "," <<d<<"," << mysqlpp::quote_only << name << ");"; 
        query.execute(); 
       } 
      } 
     } 
     conn.disconnect(); 
     return 0; 
    } 
    else { 
     cerr << "DB connection failed: " << conn.error() << endl; 
     return 1; 
    } 
} 

對不起張貼的所有代碼。 我可以編譯程序沒有錯誤,但在命令行中,它說「分段錯誤」。這是什麼錯誤?以及如何解決它?

+2

你應該讓你的下一個任務學習使用調試器,例如gdb。一個調試器會告訴你,你正在'cin >> name'行中崩潰,而'name'不是一個合理的指針。 – derobert

+0

如果你是在Linux上,嘗試[Valgrind的(http://stackoverflow.com/questions/7316306/c-segmentation-fault-with-strcmp/7316492#7316492) –

回答

7

你應該寫它之前

char * name; 

分配空間。

如果你知道這個名字不會是不再那麼MAXNAME那麼就定義名稱是

char name[MAXNAME+1] 

這應該解決您的問題。

+0

Thanx.And,還有一兩件事,我可以」 t語法突出顯示,最新情況如何? –

+0

@АйкСаркисян您自己管理它!:)如果您發現答案令人滿意,請考慮接受它。 – Beginner

+0

*如果*你真的推薦在C++中使用char數組,請*顯示如何避免緩衝區溢出。 'char name [MAXNAME + 1]'不*解決問題,它只是隱藏它們,直到沒有名字的假設不再成立爲止。 – DevSolar

5

我看你使用的是C++。在這種情況下,你應該使用

std::string name; 

所以你不必爲其分配空間。

憑經驗:如果您使用C++,使用<string>代替char[];使用<vector>而不是數組;使用由構造代替malloc()new()初始化成員變量。相信我,它會讓你的編碼生活更輕鬆。

(每條規則都有例外,但這是個開始......)

+0

是的,我已經改變它爲字符串,字符似乎是硬核。 –

+0

@АйкСаркисян請記住,串串好吃的東西不是免費的,但有性能損失。如果你可以忽略它,當然要用字符串。 – Beginner

+0

@RomanB .:城市的傳奇已經傷害了很多C++項目,因爲人們相信它,而是編寫了一半的,錯誤纏身的C風格的代碼。如果您害怕調整大小,請添加'name.reserve(MAXNAME + 1);'。當Knuth談到過早優化的話時,他就是這個意思。 **證明**在編寫'char []'之前,C++字符串是性能瓶頸。其他一切都只是低劣的做工。我見過許多受char緩衝區溢出傷害的項目,但沒有一個受到正確使用'std :: string'的傷害。 – DevSolar