我从循环中的循环写入数组。价值观正在自我写作。
一些背景说明,keyname = GET_STRING_VALUE(Ds, Os, Fs, Rs, Is);
正在从数据库中提取字符串值。一个例子是71001093
。每个Rs(此数据库的记录号)的密钥不同。 Fk
和Fs
与该数据库中的不同列相关。代码应该遍历(前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]);
示例输出:
感谢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);
}
答案 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
如果您更喜欢动态内存访问。