我正在尝试在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')"
的值。
答案 0 :(得分:1)
textArray[i]
是运行时,但是您使用的是字符串连接,即"string1" "string2"
仅在编译时有效,因为 compiler 将这些字符串连接。
使用textArray[i]
将要求编译器插入代码以评估i
和textArray[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 | +----+---------+--------+