循环中的concat char + integer

时间:2014-07-16 14:54:41

标签: c concat

我正在使用嵌入式C,

double bmenge[20];

我在代码中多次使用这些句子:

 fmasccfp.bmen01 = bmenge[0];
 fmasccfp.bmen02 = bmenge[1];
 ....
 ....
 fmasccfp.bmen20 = bmenge[19];

fmasccfp是一个包含许多其他字段的结构,bmen%i是结构字段。

我想把这些行放在一个循环中:

char count_field_number (int k )
{
    char buffer_cat[20];
    if (k <10)
    {
        sprintf(buffer_cat, "fmasccfp.bmen0%d",k+1);
    }
    else 
    {
        sprintf(buffer_cat, "fmasccfp.bmen%d",k+1); 
    }                       
    return buffer_cat;
}

主要:

  for ( int k = 0; k < 20; k++)
  {  
    buffer_cat = count_field_number(k);
    buffer_cat = bmenge[k];
  }

我知道我不能指定类型'double'来输入'char [20]'。

你能帮忙吗?

2 个答案:

答案 0 :(得分:0)

几点说明:

char buffer_cat[20];

不是一个字符,你不能使用return buffer_cat;,它基本上会将一个POINTER返回给第一个字符,但是它返回一个CHAR,所以值将在0到255之间。 功能应该是:

char* count_field_number(int k)

因为您正在返回一个char POINTER,一个指向该字符数组的指针。 现在,你可以返回一个指针,你可以,但它没用,据说 - 记忆丢失了。数组内容可能仍然在那里但是它被分配在堆栈内存中,因此在函数返回后释放内存 - 你应该动态地分配它,所以即使在函数返回之后它也会保持不变。按照以下方式进行:

char* buffer_cat = malloc(sizeof(char)*20);

malloc()基本上是一个分配您请求的字节数的函数时。我已经请求了sizeof(char)字节的20倍,这基本上是20,因为sizeof(char)总是1个字节。这样,当函数返回时,内存不会被释放,但是当参数是指针(free()时,当你使用函数free(buffer_cat);完成它时,你需要手动释放它。 )。 for循环的目的是什么?

 buffer_cat = count_field_number(k);
 buffer_cat = bmenge[k];

您丢失了count_field_number()调用的返回值,并使用bmenge [k]重写它。 当您说buffer_cat = bmenge[k];时,编译器会将其视为已授予,并将指针赋予double而不是该字符串CONTENT的double值 - 它不会将双精度赋值给字符串是什么({{ 1}}例如)。你不能在C语言的程序中执行未知的命令,据我所知,你可能会以某种方式实现它,但它真的很复杂,我要说。 取而代之的是,我只需使用指针将fmasccfp.bmen01分配给内存中的该地址。让我们说bmenge[k]bmen01最多20个是双打 - 我使用bmen02(指向内存中双重位置的指针),将其分配给{ {1}}(该双地址)然后分配double* my_double_pointer(将&fmasccfp.bmen01分配给my_double_pointer所指向的地方)并在循环中递增*my_double_pointer = bmenge[k];,不需要任何函数。只要变量在该结构中一个接一个地声明,bmenge[k]my_double_pointer++;,根据顺序,这将有效。

它基本上只是将bmen01分配给bmen20,然后它会使用bmenge[k]递增它,这意味着它会跳过那个双倍(bmen01)并继续下一个变量(sizeof(double);)。

无论如何,为什么你没有在结构中创建bmen01数组以便于使用?

答案 1 :(得分:0)

我同意@JonathanLeffler关于你的结构设计的评论。 但是,要回答你的问题,我会使用指针来浏览连续的字段:

double * bmen = &fmasccfp.bmen01;
for(size_t i=0; i<20; i++)
{
    *bmen = bmenge[i]; 
    bmen++;            
}