“ for”块内的字符串“串联”

时间:2019-01-28 14:44:16

标签: c arrays string concatenation

我正在尝试在C中实现某种“连接”,以在一个字符串中使用几个值。

代码如下:

#include <stdio.h>

#define A "A"

int main() {

    char *textArray[] = {"a", "b", "c"};
    int intArray[] = {1, 2, 3};

    int n;
    // count intArray[] lengh
    // example taken from the https://www.sanfoundry.com/c-program-number-elements-array/
    n = sizeof(intArray)/sizeof(int);

    int i;
    char *concat;
    for (i=0; i<n; i++) {
        // check if values are accessible
        printf("TEST: Macro: %s, textArray's value: %s, intArray's value: %d\n", A, textArray[i], intArray[i]);

        // making concatenation here - this will work
        concat = "Macro: " A " textArray's value: '' intArray's value: ''";

        // this will NOT work
        // expected result == 'Macro: A textArray's value: a intArray's value: 1' etc
        // concat = "Macro: " A " textArray's value: " textArray[i] " intArray's value: " intArray[i];
        printf("%s\n", concat);
    }

    return 0;
}

仅使用A宏的值时,此代码可以正常工作:

$ ./array_test 
TEST: Macro: A, textArray's value: a, intArray's value: 1
Macro: A textArray's value: '' intArray's value: ''
TEST: Macro: A, textArray's value: b, intArray's value: 2
Macro: A textArray's value: '' intArray's value: ''
TEST: Macro: A, textArray's value: c, intArray's value: 3
Macro: A textArray's value: '' intArray's value: ''

但是,如果我尝试使用textArray[i],即:

...
// making concatenation here - this will work
// concat = "Macro: " A " textArray's value: '' intArray's value: ''";

// this will NOT work
// expected result == 'Macro: A textArray's value: a intArray's value: 1' etc
concat = "Macro: " A " textArray's value: " textArray[i] " intArray's value: " intArray[i];
printf("%s\n", concat);
...

在编译过程中出现错误:

$ gcc array_test.c -o array_test
array_test.c: In function ‘main’:
array_test.c:26:53: error: expected ‘;’ before ‘textArray’
         concat = "Macro: " A " textArray's value: " textArray[i] " intArray's value: " intArray[i];

问题是:我在这里做错了什么,实现我的目标的正确方法是什么?

UPD :最终目标是将一个字符串传递给类似mysql_query()的函数,例如mysql_query(conn, concat),其中concat将包含类似"INSERT INTO TableName VALUES('textValue', 'intValue')"的值。

4 个答案:

答案 0 :(得分:1)

textArray[i]是运行时,但是您使用的是字符串连接,即"string1" "string2"仅在编译时有效,因为 compiler 将这些字符串连接。

使用textArray[i]将要求编译器插入代码以评估itextArray[i]中的字符或字符串,然后具有连接字符串的代码。

答案 1 :(得分:1)

“ string”“ string1”“ string2” 不是串联。它只是字符串文字的语法正确形式之一。

答案 2 :(得分:0)

"Foo" MACRO "Bar",其中MACRO"27"在预处理器时间展平为"Foo" "27" "Bar",然后由编译器进一步展平为"Foo27Bar"。您将必须使用标准的字符串concat函数将其他值合并为新字符串。

答案 3 :(得分:0)

感谢@Some programmer dude评论-我找到了使用sprintf()的解决方案。

所以我的代码(具有相同想法的另一个代码,“原始”代码)现在如下所示:

...
    char *textArray[] = {"a", "b", "c"};
    int intArray[] = {1, 2, 3};

    int n;
    // count intArray[] lengh
    // example taken from the https://www.sanfoundry.com/c-program-number-elements-array/
    n = sizeof(intArray)/sizeof(int);

    int i;
    for (i=0; i<n; i++) {
        // best to check needed size for malloc() using sizeof()
        // saving a query string into the `buffer` var
        sprintf(buffer, "INSERT INTO %s VALUES(NULL, '%s', '%d')" , DB_TABLE, textArray[i], intArray[i]);
        // pass connection obj + query string to the `mysql_query()`
        mysqlexec(con, buffer);
    }
...

还有一个专用的mysqlexec()函数:

void mysqlexec(MYSQL *con, char *query) {

    printf("Running query: %s\n", query);

    if (mysql_query(con, query)) {
      finish_with_error(con);
    }
}

现在一切正常:

$ ./get_id 
Running query: INSERT INTO ExampleTable VALUES(NULL, 'a', '1')
Running query: INSERT INTO ExampleTable VALUES(NULL, 'b', '2')
Running query: INSERT INTO ExampleTable VALUES(NULL, 'c', '3')
The last inserted row id is: 3

检查结果:

MariaDB [testdb]> select * from ExampleTable;
+----+---------+--------+
| Id | TextCol | IntCol |
+----+---------+--------+
|  1 | a       |      1 |
|  2 | b       |      2 |
|  3 | c       |      3 |
+----+---------+--------+