C将字符串解析为字符串数组
C parsing a string into an array of strings
在定义字符串数组时,我通常会像下面这样声明它:
char *arr[5] =
{
"example0",
"example1",
"example2",
"example3",
"example4"
};
我遇到的问题是我不知道如何将变量传递给 arr
的元素之一。
例如,
char str[6] = "1.0.0.1";
char *arr[6] =
{
"example0",
"example1",
"example2",
"example3 %s", str,
"example4"
};
当然,这不起作用,这只是我遇到问题的基本说明。
我也知道我以后可以使用 strncat()
甚至 snprintf()
但是,为了避免用这些处理内存的痛苦,我只想知道是否将变量解析为其中一个字符串数组的可能在声明时。
... if parsing a variable into one of the strings of the array is possible at declaration.
在编译时,可以连接如下:
#define STR "1.0.0.1"
char str[] = STR;
char *arr[6] = {
"example0",
"example1",
"example2",
"example3" " " STR, // Forms "example3 1.0.0.1"
"example4"
};
也许 OP 对 run-time 期间形成的东西感兴趣。它使用 variable length array (VLA).
void foobar(const char *str) {
int n = snprintf(NULL, 0, "example3 %s", str);
char a[n]; // VLA.
snprintf(a, sizeof a, "example3 %s", str);
char *arr[6] = {
"example0",
"example1",
"example2",
a,
"example4"
};
printf("<%s>\n", arr[3]);
}
int main(void) {
foobar("1.0.0.1");
}
输出
<example3 1.0.0.>
或者 字符串 的 space 可以通过分配完成。
char *a = malloc(n + 1u);
sprintf(a, "example3 %s", str);
....
free(a);
在定义字符串数组时,我通常会像下面这样声明它:
char *arr[5] =
{
"example0",
"example1",
"example2",
"example3",
"example4"
};
我遇到的问题是我不知道如何将变量传递给 arr
的元素之一。
例如,
char str[6] = "1.0.0.1";
char *arr[6] =
{
"example0",
"example1",
"example2",
"example3 %s", str,
"example4"
};
当然,这不起作用,这只是我遇到问题的基本说明。
我也知道我以后可以使用 strncat()
甚至 snprintf()
但是,为了避免用这些处理内存的痛苦,我只想知道是否将变量解析为其中一个字符串数组的可能在声明时。
... if parsing a variable into one of the strings of the array is possible at declaration.
在编译时,可以连接如下:
#define STR "1.0.0.1"
char str[] = STR;
char *arr[6] = {
"example0",
"example1",
"example2",
"example3" " " STR, // Forms "example3 1.0.0.1"
"example4"
};
也许 OP 对 run-time 期间形成的东西感兴趣。它使用 variable length array (VLA).
void foobar(const char *str) {
int n = snprintf(NULL, 0, "example3 %s", str);
char a[n]; // VLA.
snprintf(a, sizeof a, "example3 %s", str);
char *arr[6] = {
"example0",
"example1",
"example2",
a,
"example4"
};
printf("<%s>\n", arr[3]);
}
int main(void) {
foobar("1.0.0.1");
}
输出
<example3 1.0.0.>
或者 字符串 的 space 可以通过分配完成。
char *a = malloc(n + 1u);
sprintf(a, "example3 %s", str);
....
free(a);