I have following function to compare two char arrays in C:

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;
}

And somewhere in main:

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

It returns 0 immediately at i = 0. If I change function to this:

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;
}

... it works like a charm. In the first version of function test debugger says that buffer and word arrays are type of char*. In the second version of function test it says that the buffer is type of char* and the test array is type of char[]. Function strcmp() does not work neither.

What is actually wrong here? Program is made for PIC microcontroller, compiler is C18 and IDE is MPLAB.

有帮助吗?

解决方案

Hmm...

Sometimes in embedded systems there is difference where strings are stored.

In the first example you define a string which is stored in flash code region only. So the comparison will fail with index 0 because of the memory area difference.

The second example you define a local variable which contain the same string. This will be located in RAM, so the comparison works since they are both in RAM.

I would test following:

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

Most likely it is going to work because the comparison is done in RAM totally.

Yes and remove the \0 since the "WORD" will null terminate automatically.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top