【问题标题】:Array Loop Writing Over Elements C数组循环写入元素 C
【发布时间】:2014-06-25 18:29:58
【问题描述】:

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

一些背景说明,keyname = GET_STRING_VALUE(Ds, Os, Fs, Rs, Is); 正在从数据库中提取字符串值。一个例子是71001093。对于每个 Rs(此数据库的记录号),这些键将不同。 FkFs 与该数据库中的不同列相关。该代码应该遍历(前 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

标签: c arrays for-loop


【解决方案1】:

你声明:

char* stationlookup[4];

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

这样一行代码:

stationlookup[4] = '\0';

创建一个数组溢出。

【讨论】:

  • 不错,但如果我完全删除 stationlookupstrncpy 我仍然有同样的问题。
【解决方案2】:

我怀疑您的问题来自以下几行:

    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

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

【讨论】:

  • 谢谢 uesp,很好的解释和例子。
猜你喜欢
  • 2020-10-06
  • 2011-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-25
  • 2016-04-21
  • 1970-01-01
相关资源
最近更新 更多