2017-01-01 152 views
-3

我正在编写一些使用MySQL api创建数据库,插入,更新等的C代码。我在查找MySQL语法后查找最简洁/正确的方法来构建查询时遇到了一些麻烦可能会非常棘手摆在AC字符串,例如,我想查询看起来像这样的可读性:c字符串文字中的特殊字符

strcpy(query, "CREATE TABLE Users (
        userID INT NOT NULL AUTO_INCREMENT, PRIMARY KEY (userID), 
        email VARCHAR(31) NOT NULL, 
        timeEntered TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, 
        address  VARCHAR(31) NOT NULL, 
        index (email)) 
       "); 

那么当然我会跑的东西查询类似

/* send SQL query */ 
    if (mysql_query(conn, query)) { 
     fprintf(stderr, "%s\n", mysql_error(conn)); 
     exit(1); 
    } else { printf("table created\n"); } 

然而,编译器抱怨预期')'和丢失终止“等等。是最好的解决方案?

回答

1

C字符串文字不能包含换行符。你可以这样做,但:

strcpy(query, "CREATE TABLE Users (" 
       "userID INT NOT NULL AUTO_INCREMENT, PRIMARY KEY (userID), " 
       "email VARCHAR(31) NOT NULL, " 
       "timeEntered TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, " 
       "address  VARCHAR(31) NOT NULL, " 
       "index (email))"); 

这将创建一个字符串从相邻的字符串字面常量。

+0

添加的细节“不能包含换行符” - >字符串常量可以包含源字符的任何成员设置除双引号“,反斜线\或换行符” – chux

3

为了提高可读性,我建议你使用C89的字符串连接特点:

strcpy(query, "CREATE TABLE Users (" 
       "userID INT NOT NULL AUTO_INCREMENT, PRIMARY KEY (userID)," 
       "email VARCHAR(31) NOT NULL," 
       "timeEntered TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP," 
       "address  VARCHAR(31) NOT NULL," 
       "index (email))" 
); 

只需使用多达空格分开,你需要的可读性字符串文字的序列。

输入K & R C的昔日,只有这样的反斜杠换行方式:

puts("A very\ 
long string\ 
literal spanning\ 
several lines"); 
1

C++编译器通常不支持多行字符串常量,因为我认为它可能不同于编译器和编译器以及它们符合的标准级别。

它的安全它分成几个字符串没有任何分隔,这是由任何编译器理解:

strcpy(query, "CREATE TABLE Users (" 
      " userID INT NOT NULL AUTO_INCREMENT, PRIMARY KEY (userID)," 
      " email VARCHAR(31) NOT NULL," 
      " timeEntered TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP," 
      " address  VARCHAR(31) NOT NULL," 
      " index (email))" 
      );