Demonstration of the problem here: http://goo.gl/71U1xA
I am reading a file, and in that file there is a line:
SECTIE FIELD_IN #define ENDSEC
that indicates I need to store the lines following this one to a variable, but only if the line contains the part "#define".
So, I'm iterating trough the file and when the line contains "SECTIE" and "FIELD_IN", it retrieves the word with # in it and it stores it in the variable keyWord.
Now the problem is: the value in keyWord changes in the next loop without modifying it.
My textfile is:
SECTIE FIELD_IN1 #define ENDSEC
#define COL1                1,1
#define COL2                2,3
#define COL3                5,3
...etc
And the output of my code is this:
START reading line text=SECTIE FIELD_IN1 #define ENDSEC keyword1=.. new sectie keyword2=.#define. reading line text=#define COL1 1,1 keyword1=. 1,1 . start = 1! keyword3=. 1,1 .
My code:
int     x, status, start;
char    inputLine[5000 + 1];
char    copyLine[5000 + 1];
char    *keyWord = "";
FILE    *iFile;
status  = NOERROR;
x       = 0;
start   = 0;
iFile = fopen(gsz_inputFile, "r");  
if(iFile == NULL){ 
    status = ER_OPEN;
    return status;
}
while (fgets(inputLine, sizeof(inputLine), iFile) != NULL){
    printf("\n\nreading line");
    printf("\ntext=%s", inputLine);
    printf("\nkeyword1=.%s.", keyWord);
    strcpy(copyLine, inputLine);
    strlwr(copyLine);
    if(strstr(copyLine, "sectie") != NULL && strstr(copyLine, "field_in") != NULL){
        start = 1;
        printf("\nnew sectie");
        //get keyword
        keyWord = strtok(inputLine," ");
        while (keyWord != NULL)
        {
            if(strstr(keyWord, "#") != NULL){               
                break;
            }
            keyWord = strtok(NULL, " ");
        }
        printf("\nkeyword2=.%s.", keyWord); //here the keyword is correct
        continue;
    }
    if(start){
        printf("\nstart = 1!");
        printf("\nkeyword3=.%s.", keyWord);
        //status = storeString(inputLine, keyw, x); //my actual code is different
        if(status != NOERROR){ x--; }
        x++;
    }       
}
I think it has something to do with while (fgets(inputLine, sizeof(inputLine), iFile) != NULL) because after that line is executed, the value is changed.
Why is the value of keyWord changed after going into the next loop? My guess it has to do with undefined behavior, but I can't put my finger on the problem.
                        
You have
inputLinewhich is an array. Inside it you store the string fetched byfgets():And in your loop you say
keyWordpoints to some inputLine's token (which means it points to somewhere inside your array).When you run the second
fgets()the array content's change, but not its address, so keyWord still points to inputLine content's which have changedExample:
You assumption "The value of
keyWordchanged" is false: The value of keyword is still the same, you can check it withprintf("value of keyWord: %p\n", keyWord);. What changed is the valuekeyWordpoints to, which is what you display using%sin printf.