从 C 中的整数向量创建一个字符串
Create a string from a vector of integers in C
我正在尝试从向量创建一个字符串,如下所示:
int vector[3] = {1, 2, 3}
.
那么,我得到的字符串应该是:
[1, 2, 3]
存储在一些 char[]
变量中。
我试着像下面这样动态地做:
void print_vector(int *vector, int lon){
char *str = (char*)calloc(3*lon, sizeof(char));
str[0] = "[";
str[1] = (char) vector[0];
for(int i = 1; i < lon; i += 3){
str[i] = (char)vector[i];
if(i != lon - 1){
str[i + 1] = (char)",";
str[i + 2] = " ";
}else{
str[i + 1] = "]";
}
}
printf("%s\n", str);
}
其中 lon 是向量的长度,但我从编译器那里收到此警告:
警告:从 "char *" 到 "char" 的赋值从指针创建一个整数,无需转换 [-Wint-conversion]
我做错了什么?谢谢
您正在尝试将字符串分配给 char
数组元素。您需要使用单引号来创建 char
个常量。
所以
str[0] = "[";
应该是
str[0] = '[';
所有其他作业也类似。
另一个问题是(char)vector[i]
不会returnvector[i]
中数字的字符表示。它只是使用整数作为字符代码。因此,如果 vector[i]
为 1,则生成 ''
,而不是 '1'
。获取数字字符表示的方法是 '0' + vector[i]
.
最后,您需要在字符串末尾添加一个空终止符,以便您可以使用 %s
格式打印它。您应该在 returning 之前释放它以防止内存泄漏。
其他问题:您只是将 vector
的每个第 3 个元素放入字符串中。您需要为 vector
和 str
使用单独的索引。数组索引从 0
开始,而不是 1
.
void print_vector(int *vector, int lon){
char *str = (char*)calloc(3*lon, sizeof(char));
str[0] = "[";
str[1] = (char) vector[0];
for(int i = 0; i < lon; i++){
str[i*3] = '0' + vector[i];
if(i != lon - 1){
str[i*3 + 1] = ',';
str[i*3 + 2] = ' ';
}else{
str[i*3 + 1] = ']';
str[i*3 + 2] = '[=12=]';
}
}
printf("%s\n", str);
}
假设向量中的每个元素都是一个数字,并且每个元素的间距相同...
...并记住您需要在末尾分配一个空字节来终止您的字符串...
...也许是这样的 (uncompiled/untested):
void print_vector(int *vector, int lon){
char *str = (char*)calloc((3*lon)+1, sizeof(char));
char *s = str;
*s++ = "[";
int i=1;
while (i < lon) {
*s++ = vector[i] + 0x30; // ASCII "0"= 0x30, "1"= 0x31, ...
*s++ = ',';
*s++ = ' ';
i++;
}
s -= 2;
*s++ = ']';
*s++ = 0;
printf("%s\n", str);
您的代码存在几个问题 -
- 您正在使用
"
而不是 '
。 "
用于创建类型为 char*
的字符串文字。因此你得到的错误。
(char) vector[0];
不是将整数转换为字符串的正确方法。你应该使用像 sprintf
. 这样的东西
- 调用
calloc
(方括号、逗号、space、空终止符)时,您没有分配足够的内存。
- 您只是在填充缓冲区中的某些字符。其余初始化为
0
。这将导致字符串比预期提前终止。
首先,您可以将代码修改为 -
void print_vector(int *vector, int lon){
char *str = calloc(5*lon+3, sizeof(char));
// 5 for each character (3 characters per integer + space + comma.
// Two brackets and nul-terminator
strcpy(str, "[");
if (lon) {
sprintf(str+1, "%d", vector[0]);
for(int i = 1; i < lon; i++){
sprintf(str + strlen(str), ", %d", vector[i]);
}
}
strcat(str, "]");
printf("%s\n", str);
}
您可以找到工作演示 here on ideone。
我正在尝试从向量创建一个字符串,如下所示:
int vector[3] = {1, 2, 3}
.
那么,我得到的字符串应该是:
[1, 2, 3]
存储在一些 char[]
变量中。
我试着像下面这样动态地做:
void print_vector(int *vector, int lon){
char *str = (char*)calloc(3*lon, sizeof(char));
str[0] = "[";
str[1] = (char) vector[0];
for(int i = 1; i < lon; i += 3){
str[i] = (char)vector[i];
if(i != lon - 1){
str[i + 1] = (char)",";
str[i + 2] = " ";
}else{
str[i + 1] = "]";
}
}
printf("%s\n", str);
}
其中 lon 是向量的长度,但我从编译器那里收到此警告:
警告:从 "char *" 到 "char" 的赋值从指针创建一个整数,无需转换 [-Wint-conversion]
我做错了什么?谢谢
您正在尝试将字符串分配给 char
数组元素。您需要使用单引号来创建 char
个常量。
所以
str[0] = "[";
应该是
str[0] = '[';
所有其他作业也类似。
另一个问题是(char)vector[i]
不会returnvector[i]
中数字的字符表示。它只是使用整数作为字符代码。因此,如果 vector[i]
为 1,则生成 ''
,而不是 '1'
。获取数字字符表示的方法是 '0' + vector[i]
.
最后,您需要在字符串末尾添加一个空终止符,以便您可以使用 %s
格式打印它。您应该在 returning 之前释放它以防止内存泄漏。
其他问题:您只是将 vector
的每个第 3 个元素放入字符串中。您需要为 vector
和 str
使用单独的索引。数组索引从 0
开始,而不是 1
.
void print_vector(int *vector, int lon){
char *str = (char*)calloc(3*lon, sizeof(char));
str[0] = "[";
str[1] = (char) vector[0];
for(int i = 0; i < lon; i++){
str[i*3] = '0' + vector[i];
if(i != lon - 1){
str[i*3 + 1] = ',';
str[i*3 + 2] = ' ';
}else{
str[i*3 + 1] = ']';
str[i*3 + 2] = '[=12=]';
}
}
printf("%s\n", str);
}
假设向量中的每个元素都是一个数字,并且每个元素的间距相同...
...并记住您需要在末尾分配一个空字节来终止您的字符串...
...也许是这样的 (uncompiled/untested):
void print_vector(int *vector, int lon){
char *str = (char*)calloc((3*lon)+1, sizeof(char));
char *s = str;
*s++ = "[";
int i=1;
while (i < lon) {
*s++ = vector[i] + 0x30; // ASCII "0"= 0x30, "1"= 0x31, ...
*s++ = ',';
*s++ = ' ';
i++;
}
s -= 2;
*s++ = ']';
*s++ = 0;
printf("%s\n", str);
您的代码存在几个问题 -
- 您正在使用
"
而不是'
。"
用于创建类型为char*
的字符串文字。因此你得到的错误。 (char) vector[0];
不是将整数转换为字符串的正确方法。你应该使用像sprintf
. 这样的东西
- 调用
calloc
(方括号、逗号、space、空终止符)时,您没有分配足够的内存。 - 您只是在填充缓冲区中的某些字符。其余初始化为
0
。这将导致字符串比预期提前终止。
首先,您可以将代码修改为 -
void print_vector(int *vector, int lon){
char *str = calloc(5*lon+3, sizeof(char));
// 5 for each character (3 characters per integer + space + comma.
// Two brackets and nul-terminator
strcpy(str, "[");
if (lon) {
sprintf(str+1, "%d", vector[0]);
for(int i = 1; i < lon; i++){
sprintf(str + strlen(str), ", %d", vector[i]);
}
}
strcat(str, "]");
printf("%s\n", str);
}
您可以找到工作演示 here on ideone。