Мое условие IF ведет себя странно, ПОМОГИТЕ C

У меня проблема с моим состоянием:

if(pos + strlen(string) > 0){
    printf("#");
    string = &string[pos*-1];               
    pos = 0;                
}

в процедуре:

void text_buffer(bool strict, int x, int y, char *string){
    if(active_buff){
        int pos = active_buff -> width * y + x;

        if(pos < 0){
            int cnt = strlen(string) + pos;
            printf("%d %s", cnt, cnt > 0 ? "true" : "false");

            if(pos + strlen(string) > 0){
                printf("#");
                string = &string[pos*-1];               
                pos = 0;                
            }

            else
                return;
        }
        if(pos >= active_buff -> length - 1)
            return;
        char *copy = &(active_buff -> buff[pos]);
        if(strict)
            for(; x < active_buff -> width && *copy && *string; copy++, string++, x++)
                *copy = *string;
        else
            for(; *copy && *string; copy++, string++)
                *copy = *string;
    }
}

Например: когда я передаю текст длиной 15 символов «Hello World! 99», а переменная «pos» вычисляется как -2000, тогда упомянутое мною условие будет иметь значение true.

Но если я сохраню (pos + strlen(string)) в переменную 'cnt', а не оставлю вычисление в состоянии, тогда его значение будет 'false'.

Понятия не имею, я пытался поставить (pos + strlen(string)) в круглые скобки в этом условии if, но все равно не повезло.


person Ruza    schedule 29.10.2014    source источник
comment
Как насчет публикации всего соответствующего кода? Что такое actve_buff и где он определяется?   -  person EOF    schedule 29.10.2014
comment
я не вижу, где определено значение active_buff-›width... вы уверены, что это не дает вам мусорное значение?   -  person Trudysfun    schedule 29.10.2014
comment
active_buff — это не проблема, это глобальная структура, которая определяет, какой буфер уже используется. БУФЕР *active_buff = NULL;   -  person Ruza    schedule 29.10.2014


Ответы (1)


Если pos равно -2000 (как вы сказали в вопросе), то выражение в условии:

if(pos + strlen(string) > 0) {...}

будет очень большим числом (точное значение зависит от ширины size_t на вашей платформе) и будет равно true.

Это связано с тем, что вы добавляете int к целому числу без знака (strlen() возвращает size_t), что приводит к типу целого числа без знака и всегда будет больше или равно нулю.

Вы можете сделать:

if(pos + (int)strlen(string) > 0)  {...} 
person P.P    schedule 29.10.2014
comment
Да, это была проблема, спасибо. Я даже не понял, что он возвращает целые числа без знака, поэтому он перепечатал меня все в беззнаковые. Теперь работает правильно :) спасибо - person Ruza; 29.10.2014