Строки "конкатенация" внутри блока 'for' - PullRequest
0 голосов
/ 28 января 2019

Я пытаюсь реализовать некоторую «конкатенацию» в 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 голосов
/ 28 января 2019

Благодаря комментарию @ Некоторые программисты чувак - я нашел решение, используя 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 |
+----+---------+--------+
0 голосов
/ 28 января 2019

textArray[i] - это время выполнения, но конкатенация строк при использовании, т. Е. "string1" "string2" действительна только во время компиляции, так как компилятор объединяет эти строки.

Использование textArray[i]потребует от компилятора вставить код для оценки i и символ или строку в textArray[i], а затем иметь код для конкатенации строк.

0 голосов
/ 28 января 2019

"строка" "строка1" "строка2" не является конкатенацией .Это только одна из синтаксически правильных форм строкового литерала.

0 голосов
/ 28 января 2019

"Foo" MACRO "Bar", где MACRO - это "27", выравнивается до "Foo" "27" "Bar" во время препроцессора, а затем компилируется в "Foo27Bar".Вам нужно будет использовать стандартную строковую функцию concat для объединения других значений в новую строку.

...