【发布时间】:2014-06-25 18:29:58
【问题描述】:
我正在从循环中的循环写入数组。价值观正在改写自己。
一些背景说明,keyname = GET_STRING_VALUE(Ds, Os, Fs, Rs, Is); 正在从数据库中提取字符串值。一个例子是71001093。对于每个 Rs(此数据库的记录号),这些键将不同。 Fk 和 Fs 与该数据库中的不同列相关。该代码应该遍历(前 5 个)数据库记录并找到将其与键相关联的名称。对于匹配 keycmp 的名称,将它们添加到数组中。
问题
底部的 ArrayCheck 打印输出都显示最后输入到数组中的键。键和计数器打印输出在循环中显示正确的迭代数和相关键。
代码
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);
}
【问题讨论】:
-
你能给我们一个样本运行/输出吗?我不确定问题是什么。我知道您可能是想使用
strlcpy而不是strncpy。此外,在分配status_keys[0][a] = key;和status_keys[1][a] = stationlookup;时,您似乎在做“浅拷贝”而不是“深拷贝”。 -
指针问题可能吗?尝试将 status_keys[0][a] 直接设置为 GET_STRING_VALUE 以避免使用 key 变量。这至少会告诉您 key 是否存在指针问题。
-
Flyingcows00 - 与
status_keys[0][a] = GET_STRING_VALUE(Ds, Os, Fk, Rs, Is);相同的问题 -
关于这一行:char* stationlookup[4];它定义了 4 个指向字符串的指针,而不是 4 个字符的数组。
-
关于这一行:stationlookup[4] = '\0';它正在写入第 5 个字符指针,但是 char 指针数组中只有 4 个字符指针:stationlookup