2011-11-28 69 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