字符串变量不更新C ++

时间:2020-06-15 00:50:55

标签: c++

我有一个程序,该程序基本上打开一个.sql数据库文件,并将表名返回到字符串向量中。此字符串向量存储为tableNames,并包含给定数据库文件中的表。由于某些我无法理解的原因,tableName字符串中的sqlCreateTemp参数未更新,但变量tableName已更新。

void fileWrite()
{
    string tableName;
    string sqlCreateTemp = "CREATE TABLE tempLog AS SELECT * FROM " + tableName + "; UPDATE tempLog SET TIMESTAMP1=strftime('%s', datetime(timestamp1, 'localtime')) + strftime('%f', timestamp1) - strftime('%S', timestamp1);";


    int rc = -1;
    vector<string> tableNames = getTableNames();

    for(int i = 0; i < tableNames.size(); i++)
    {
        cout << "TABLENAMES = " << tableNames[i] << endl;
        tableName = tableNames[i] ;
        cout << "tableName = " tableName << endl;
        cout << "SQL = " << sqlCreateTemp << endl;
    }
}

输出:

TABLENAMES = testTableABC
tableName = testTableABC
SQL = CREATE TABLE tempLog AS SELECT * FROM ; UPDATE tempLog SET TIMESTAMP1=strftime('%s', datetime(timestamp1, 'localtime')) + strftime('%f', timestamp1) - strftime('%S', timestamp1);

3 个答案:

答案 0 :(得分:1)

您的计算机以一种逻辑方式一次执行一个语句。

string tableName;

这将创建一个新的std::string。这是一个空字符串。

string sqlCreateTemp = "CREATE TABLE tempLog AS SELECT * FROM " + tableName + ...

这将创建另一个std::string,其内容包括tableName。正如我们刚刚观察到的,这是空的,因此sqlCreateTemp的这部分内容是空的。

稍后执行的代码然后设置tableName的新值:

tableName = tableNames[i] ;

很好,但这不会自动更改sqlCreateName的内容。 C ++无法以这种方式工作。它的值是在此函数的开头设置的,以后再也不会更改。在设置时,tableName是一个空字符串,就是这样。

如果每次sqlCreateTemp更改时都想创建一个新值tableName,则必须编写代码来完成。毕竟,“计算机编程的黄金法则”说:您的计算机总是准确无误地执行您告诉它要做的事情,而不是要执行的事情。如果您想让计算机更改sqlCreateTemp的值,则每次tableName的值更改时,都必须准确地告诉计算机执行此操作。

答案 1 :(得分:0)

您需要在更新let webNavView = WebNavToolbarView(viewLayoutMarginsGuide: view.layoutMarginsGuide) let yPosition: CGFloat = webNavView.frame.height / 4 let xOffset: CGFloat = 8 let backButton = createButton( image: .back, xPosition: xOffset, yPosition: yPosition, selector: #selector(goBackPressed) ) let forwardButton = createButton( image: .forward, xPosition: backButton.frame.maxX + xOffset, yPosition: yPosition, selector: #selector(goForwardPressed) ) // FIXME: Doing this just to get the width for the createButtonMethod's xPosition parameter let homeButton = createButton( image: .home, xPosition: webNavView.frame.maxX - forwardButton.frame.width - xOffset, yPosition: yPosition, selector: #selector(goHomeButtonPressed) ) webNavView.translatesAutoresizingMaskIntoConstraints = false webNavView.addSubview(backButton) webNavView.addSubview(forwardButton) webNavView.addSubview(homeButton) self.view.addSubview(webNavView) 变量后更新sqlCreateTemp,如下所示:

tableName

答案 2 :(得分:0)

以这种方式进行操作,以便您的tableName变量得到更新:

void fileWrite()
{
    string tableName;
    string sqlCreateTemp_part1 = "CREATE TABLE tempLog AS SELECT * FROM ";
    string sqlCreateTemp_part2 = "; UPDATE tempLog SET TIMESTAMP1=strftime('%s', datetime(timestamp1, 'localtime')) + strftime('%f', timestamp1) - strftime('%S', timestamp1);";

    string sqlCreateTemp;

    int rc = -1;
    vector<string> tableNames = getTableNames();

    for(int i = 0; i < tableNames.size(); i++)
    {
        cout << "TABLENAMES = " << tableNames[i] << endl;
        tableName = tableNames[i] ;
        cout << "tableName = " tableName << endl;
        sqlCreateTemp = sqlCreateTemp_part1 + tableName + sqlCreateTemp_part2;
        cout << "SQL = " << sqlCreateTemp + << endl;
    }
}