数组循环写在元素C

时间:2014-06-25 18:29:59

标签: c arrays for-loop

我从循环中的循环写入数组。价值观正在自我写作。

一些背景说明,keyname = GET_STRING_VALUE(Ds, Os, Fs, Rs, Is);正在从数据库中提取字符串值。一个例子是71001093。每个Rs(此数据库的记录号)的密钥不同。 FkFs与该数据库中的不同列相关。代码应该遍历(前5个)数据库的记录,并找到将其与密钥相关联的名称。对于与keycmp匹配的名称,将它们添加到数组中。

问题

底部的ArrayCheck打印输出显示输入到阵列中的最后一个键。关键& counter print out在循环中显示正确的迭代次数和相关密钥。

代码

char* status_keys [ 2 ][ 200 ];
int Ds, Os, Fs, Rs, Is, Fk, a, c;
char* keyname;
char* keycmp;
char* stationlookup[4];
char* key;

keycmp = "STRING";
for ( Rs = 1; Rs < 5; Rs++ ) {

    keyname = GET_STRING_VALUE(Ds, Os, Fs, Rs, Is);

    printf("keyname: %s\n", keyname);

do {
        strncpy(stationlookup, keyname, 4);
        stationlookup[4] = '\0';

        key = GET_STRING_VALUE(Ds, Os, Fk, Rs, Is);
        printf("key : %s\n",key);
        printf("counter : %d\n",a);


        status_keys[0][a] = key;
        status_keys[1][a] = stationlookup;

        a++;

    } while (strstr(keyname,keycmp) != NULL);

}

printf("ArrayCheck 0: %s\n", status_keys[0][0]);
printf("ArrayCheck 1: %s\n", status_keys[0][1]);
printf("ArrayCheck 2: %s\n", status_keys[0][2]);    
printf("ArrayCheck 3: %s\n", status_keys[0][3]);

示例输出: enter image description here

感谢stationlookup帮助,但此代码仍然提供了写作问题。

for ( Rs = 1; Rs < 5 ; Rs++ ) {

keyname = GET_STRING_VALUE(Ds, Os, Fs, Rs, Is);

printf("keyname: %s\n", keyname);

do {
        status_keys[0][a] = GET_STRING_VALUE(Ds, Os, Fk, Rs, Is);
        printf("key : %s\n",status_keys[0][a]);
        printf("counter : %d\n",a);
        a++;

    } while (strstr(keyname,keycmp) != NULL);

}

2 个答案:

答案 0 :(得分:3)

你宣布:

char* stationlookup[4];

这意味着有效索引为[0][1][2][3]

这样的一行代码:

stationlookup[4] = '\0';

创建一个数组溢出。

答案 1 :(得分:0)

我怀疑你的问题来自这些方面:

    status_keys[0][a] = key;
    status_keys[1][a] = stationlookup;

假设GET_STRING_VALUE()在每次调用时返回相同的字符串指针。上面的行不会复制字符串,而是复制字符串指针,这会导致您的数组元素被覆盖。您可以通过以下方式打印指针值来检查:

   printf("keyptr : %p\n", key);

要更正此问题,您需要将代码更改为:

   char status_keys [ 2 ][ 200 ][64];
   ...
   strncpy(status_keys[0][a], key, 62); // or strlcpy() if you have it
   strncpy(status_keys[1][a], stationlookup, 62);

或类似的东西:

   char* status_keys [ 2 ][ 200 ];
   ...
   status_keys[0][a] = malloc(strlen(key)+1); 
   strcpy(status_keys[0][a], key);

      // Same for stationlookup
      // Make sure to free() the strings at some point

如果您更喜欢动态内存访问。