【问题标题】:Char array comparison in CC中的字符数组比较
【发布时间】:2013-12-08 18:52:05
【问题描述】:

我有以下函数来比较 C 中的两个 char 数组:

short test(char buffer[], char word[], int length) {
    int i;
    for(i = 0; i < length; i++) {
        if(buffer[i] != word[i]) {
            return 0;
        }
    }
    return 1;
}

在 main 的某个地方:

char buffer[5]; //which is filled correctly later
...
test(buffer, "WORD", 5);

它在 i = 0 立即返回 0。如果我将函数更改为:

short test(char buffer[], int length) {
    int i;
    char word[5] = "WORD";
    for(i = 0; i < length; i++) {
        if(buffer[i] != word[i]) {
            return 0;
        }
    }
    return 1;
}

...它就像一个魅力。在函数测试调试器的第一个版本中,缓冲区和字数组是 char* 类型。在函数测试的第二个版本中,它说缓冲区是 char* 类型,而测试数组是 char[] 类型。函数 strcmp() 也不起作用。

这里到底出了什么问题?程序是为PIC单片机编写的,编译器是C18,IDE是MPLAB。

【问题讨论】:

  • 你传入 word[] 然后使用 ukaz[] ???
  • 抱歉 ukaz 来自哪里?
  • 糟糕...忘记翻译了!现已更正。 @MitchWheat
  • @drive235 你说buffer 填写正确,但我对此表示怀疑。此外,在第二个示例中,您将 word 声明为 5 个字符的数组,然后用 6 个字符对其进行初始化。我不知道您的编译器对此做了什么,但这不是您应该如何做的。您不需要将 \0 添加到 C 中的文字字符串,除非该字符串需要双空终止。
  • 我假设您知道它会立即返回 0,因为您将 printf() 放在那里或其他东西可以看到。为什么不看看 buffer[0] 和 word[0] 是什么?可能是您正在寻找的线索。

标签: c arrays char c18


【解决方案1】:

嗯……

有时在嵌入式系统中存储字符串的位置有所不同。

在第一个示例中,您定义了一个仅存储在闪存代码区域中的字符串。因此,由于内存区域差异,比较将失败,索引为 0。

第二个例子你定义了一个包含相同字符串的局部变量。这将位于 RAM 中,因此比较有效,因为它们都在 RAM 中。

我会测试以下内容:

char buffer[5]; //which is filled correctly later
char word[5] = "WORD";
...
test(buffer, word, 5);

很可能它会起作用,因为比较完全在 RAM 中完成。

是的,删除\0,因为“WORD”将自动终止。

【讨论】:

  • 伙计,你拯救了这一天(黑夜)。谢谢!
  • 好。可以归结为 PIC 组件无法在闪存和内存之间进行比较。而那些小型设备编译器不足以处理这种情况。 Keil 和 SDCC 有时也会发生同样的情况
  • 如前所述,这与 PIC18 具有哈佛架构有关,该架构具有单独的地址空间和用于访问 FLASH 中的数据和 RAM 中的变量的指令。标准库确实提供了一组备用字符串函数来处理 FLASH 指针,在这种情况下,您想尝试 strncmppgm2ram(buffer, "WORD", length)。旁注:MCC18 是一个非常可怕的编译器,远远超过我在任何地方遇到的任何其他东西。如果您重视自己的理智改用 XC18。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-06
相关资源
最近更新 更多