c字符串文字中的特殊字符

时间:2017-01-01 21:19:24

标签: c

我正在使用MySQL api编写一些C代码来创建数据库,插入,更新等。我在查找构建查询的最干净/正确方法时遇到一些麻烦,因为MySQL语法可能很难放入例如,ac字符串,我希望查询看起来像这样可读:

   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"); }
然而,编译器抱怨预期')'并且缺少终止“等等。最好的解决方案是什么?

3 个答案:

答案 0 :(得分: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 :(得分: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))");

这将从相邻的字符串文字中创建一个字符串文字。

答案 2 :(得分:1)

C ++编译器通常不支持多行字符串常量,对于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))"
             );